【发布时间】:2015-10-17 19:50:46
【问题描述】:
我正在尝试设置我的 Web 服务,以便可以互换地使用 json 和 xml 进行序列化和反序列化。
我设置了控制器来处理调用:
@RequestMapping(value = "/profiles/users/{id}", method = RequestMethod.GET, produces = {"application/json", "application/xml"}, consumes = {"application/json", "application/xml"})
public WebServiceResponse getIndividualUser(@PathVariable int id){
WebServicePayload payload = new WebServicePayload(personService.findById(id));
List list = new ArrayList<String>();
list.add("Person Retrieved");
return new WebServiceResponse(new WebServiceResponseStatus(WebServiceResponseStatus.Request.Successful, list), payload);
}
然后我尝试使用 cURL 语句反序列化我的对象:
curl -X GET -H "Content-Type: application/json" -H "Accepts: application/json" http://localhost:8080/user-profile-ws/profiles/users/1.json
curl -X GET -H "Content-Type: application/xml" -H "Accepts: application/xml" http://localhost:8080/user-profile-ws/profiles/users/1.xml
我得到的错误是
此请求标识的资源只能生成具有根据请求“接受”标头不可接受的特征的响应。
它本身的错误听起来很直截了当,但我无法弄清楚。我知道我的 cURL 和控制器中的接受标头是正确的,所以我不确定问题出在哪里。我正在从 jaxb 迁移到使用 jackson 的 xml 编组,所以我认为问题可能在于我如何将转换器添加到 spring。 json 方面工作正常,只是导致错误的 xml。
我将转换器添加到 spring 中(在我的 servlet 配置类中):
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(getMappingJackson2HttpMessageConverter());
converters.add(getMappingJacksonXmlConverter());
super.configureMessageConverters(converters);
}
public HttpMessageConverter<?> getMappingJackson2HttpMessageConverter() {
return new MappingJackson2HttpMessageConverter(getJackson2ObjectMapperBuilder().build());
}
public HttpMessageConverter<?> getMappingJacksonXmlConverter() {
return new MappingJackson2HttpMessageConverter(getJacksonXmlObjectMapper());
}
@Bean(name = "xmlMapper")
public XmlMapper getJacksonXmlObjectMapper() {
XmlMapper mapper = new XmlMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
return mapper;
}
@Bean
public Jackson2ObjectMapperBuilder getJackson2ObjectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.indentOutput(true).dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
builder.autoDetectFields(true);
builder.autoDetectGettersSetters(true);
builder.annotationIntrospector(getJacksonAnnotationIntrospector());
return builder;
}
据我所知,我正确添加了它们,但我看不出是什么导致了错误。
任何帮助都是appriciated
【问题讨论】: