【发布时间】:2014-10-29 05:33:47
【问题描述】:
我正在使用 Spring 4.0.7
我有一个用 JSON 和 XML 表示的实体。
@Entity
@Table(name="person")
@XmlRootElement(name="person")
@XmlType(propOrder = {"id",…,"address"})
public class Person implements Serializable {
我有以下方法:
@RequestMapping(value="/{id}/customized",
method=RequestMethod.GET,
produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<Person> getPersonCustomized(@PathVariable Integer id){
logger.info("PersonRestResponseEntityController - getPersonCustomized - id: {}", id);
Person person = personMapRepository.findPerson(id);
return new ResponseEntity<>(person, HttpStatus.FOUND);//302
}
通过 RestTemplate 我可以做到以下几点:
public Person getPersonCustomized(String id, String type){
HttpHeaders headers = new HttpHeaders();
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));
}
else if(type.equals("MIX01")){
logger.info("MIX01 - XML _ JSON");
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON));
}
else if(type.equals("MIX02")){
logger.info("MIX01 - JSON _ XML");
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
}
ResponseEntity<Person> response =
restTemplate.exchange("http://localhost:8080/spring-utility/person/{id}/customized",
HttpMethod.GET,
new HttpEntity<Person>(headers),
Person.class,
id
);
logger.info("status: {}", response.getStatusCode());
logger.info("body: {}", response.getBody());
return response.getBody();
}
该应用程序运行良好。没有例外等等。
但我对以下内容感到困惑:
一个
如果我在任何网络浏览器中输入 URL:
http://localhost:8080/spring-utility/person/2/customized
它会自动以预期的方式呈现内容,但始终以 XML 格式呈现。
即使我有:
-
produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
我假设应该首先选择 JSON(似乎顺序无关紧要)
无论如何,总是选择默认的 XML。
因此:
- 为什么XML已经被选为默认格式了?
两个
根据API HttpHeaders for the method setAccept
设置接受
public void setAccept(List<MediaType> acceptableMediaTypes)
Set the list of acceptable media types, as specified by the Accept header.
Parameters:
acceptableMediaTypes - the acceptable media types
它有一个List<MediaType>,所以我决定测试和玩。
通过我上面显示的代码怎么看,我有两种情况
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON));headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
每一个代表的地方
Accept=application/xml, application/jsonAccept=application/json, application/xml
通过 RestTemplate 我总是可以看到 Person 对象已经转换或转换,所以没有什么新东西
因此,只是玩Poster
如果我设置标题值
-
Accept=application/xml, application/json那么响应是 XML 格式 -
Accept=application/json, application/xml那么响应是 JSON 格式
因此,我假设第二个被忽略。
如果我是正确的,那么
-
setAccept(List<MediaType> acceptableMediaTypes)的意义何在? 我的意思是发送List? - 如果我们发送一个列表,有什么意义或有用或应该有效?。
- 当我们发送接受列表时,预期的行为是什么?
【问题讨论】:
标签: spring spring-mvc spring-3 spring-4