我正在使用Spring 4.0.7
关于Spring MVC,出于研究目的,我有以下几点:
@RequestMapping(value="/getjsonperson", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE) public @ResponseBody Person getJSONPerson(){ logger.info("getJSONPerson - getjsonperson"); return PersonFactory.createPerson(); } @RequestMapping(value="/getperson.json", method=RequestMethod.GET) public @ResponseBody Person getPersonJSON(){ logger.info("getPerson - getpersonJSON"); return PersonFactory.createPerson(); }
每一个都可以正常工作,无论有无扩展名,都可以观察JSON:
与XML相同
@RequestMapping(value="/getxmlperson", method=RequestMethod.GET, produces=MediaType.APPLICATION_XML_VALUE ) public @ResponseBody Person getXMLPerson(){ logger.info("getXMLPerson - getxmlperson"); return PersonFactory.createPerson(); } @RequestMapping(value="/getperson.xml", method=RequestMethod.GET) @ResponseBody public Person getPersonXML(){ logger.info("getPerson - getpersonXML"); return PersonFactory.createPerson(); }
每个都工作正常,对XML进行观察,并带有和不带有扩展名:
现在关于 Restful 我有以下内容:
@RequestMapping(value="/person/{id}/", method=RequestMethod.GET, produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) public ResponseEntity<Person> getPersonCustomizedRestrict(@PathVariable Integer id){ Person person = personMapRepository.findPerson(id); return new ResponseEntity<>(person, HttpStatus.FOUND);//302 }
注意MediaType,对于JSON和XML,它是混合的
MediaType
通过 RestTemplate 我可以指示Accept值
Accept
if(type.equals("JSON")){ logger.info("JSON"); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); } else if(type.equals("XML")){ logger.info("XML"); headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML)); } …. ResponseEntity<Person> response = restTemplate.exchange("http://localhost:8080/spring-utility/person/{id}/customizedrestrict", HttpMethod.GET, new HttpEntity<Person>(headers), Person.class, id );
因此,在此之前,我可以使用一个URL / URI来获取XML或JSON格式的一些数据。工作正常
我的问题是Spring MVC…考虑一下
@RequestMapping(value="/{id}/person", method=RequestMethod.GET, produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) public @ResponseBody Person getPerson(@PathVariable Integer id){ return personMapRepository.findPerson(id); }
我可以@RequestMapping通过以下方式调用或激活该处理程序方法():
@RequestMapping
Headers
问题一:
但是对于一个普通的链接?如何设置Accept值?有可能吗
我以其他方式想到了这个问题。
http://localhost:8080/spring-utility/person/getpersonformat?format=json
http://localhost:8080/spring-utility/person/getpersonformat?format=xml
观察:
?format
因此
@RequestMapping(value="/getpersonformat", method=RequestMethod.GET, produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) public @ResponseBody Person getPerson(@RequestParam String format){ return personMapRepository.findPerson(id); }
问题二:
必须添加上面显示的方法的哪些代码以自定义返回类型格式?我的意思是JSON或XML,可能吗?
我想到了以下几点:
@RequestMapping(value="/getpersonformataltern", method=RequestMethod.GET produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE} ) public ResponseEntity<Person> getPersonFormat(@RequestParam String format){ logger.info("getPersonFormat - format: {}", format); HttpHeaders httpHeaders = new HttpHeaders(); if(format.equals("json")){ logger.info("Ok JSON"); httpHeaders.setContentType(MediaType.APPLICATION_JSON); } else{ logger.info("Ok XML"); httpHeaders.setContentType(MediaType.APPLICATION_XML); } return new ResponseEntity<>(PersonFactory.createPerson(), httpHeaders, HttpStatus.OK); }
但:
如果执行URL:
http://localhost:8080/spring-utility/person/getpersonformataltern?format=json
我懂了
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <person> <id>1</id> <firstName>Manuel</firstName> <lastName>Jordan</lastName> … </person>
是的,在 XML中 !
注意 :我可以确认控制台打印Ok JSON
Ok JSON
http://localhost:8080/spring-utility/person/getpersonformataltern?format=xml
This XML file does not appear to have any style information associated with it. The document tree is shown below. <person> <id>1</id> <firstName>Manuel</firstName> <lastName>Jordan</lastName> … </person>
问题三
必须添加上面显示的方法的什么代码才能修复JSON输出?我不知道什么是错的或丢失的..
有三个问题。
谢谢
Α
@Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { Map<String,MediaType> mediaTypes = new LinkedHashMap<>(); mediaTypes.put("json", MediaType.APPLICATION_JSON); mediaTypes.put("xml", MediaType.APPLICATION_XML); configurer.mediaTypes(mediaTypes); configurer.defaultContentType(MediaType.TEXT_HTML); }
使用Accept标头真的很容易从REST服务中获取json或xml格式。
这是我的控制器,看一下产生部分。
@RequestMapping(value = "properties", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}, method = RequestMethod.GET) public UIProperty getProperties() { return uiProperty; }
为了使用REST服务,我们可以使用下面的代码,其中标头可以是MediaType.APPLICATION_JSON_VALUE或MediaType.APPLICATION_XML_VALUE
HttpHeaders headers = new HttpHeaders(); headers.add("Accept", header); HttpEntity entity = new HttpEntity(headers); RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> response = restTemplate.exchange("http://localhost:8080/properties", HttpMethod.GET, entity,String.class); return response.getBody();
编辑01:
为了配合使用application/xml,请添加此依赖项
application/xml
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>