Java Spring-cURLS不使用Jackson XML映射器反序列化
我正在尝试设置我的web服务,以便可以交替使用json和xml进行序列化和反序列化 我已设置控制器来处理呼叫:Java Spring-cURLS不使用Jackson XML映射器反序列化,java,json,xml,spring,curl,Java,Json,Xml,Spring,Curl,我正在尝试设置我的web服务,以便可以交替使用json和xml进行序列化和反序列化 我已设置控制器来处理呼叫: @RequestMapping(value = "/profiles/users/{id}", method = RequestMethod.GET, produces = {"application/json", "application/xml"}, consumes = {"application/json", "application/xml"}) public WebServ
@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和控制器中的accept头是正确的,所以我不确定问题出在哪里。我正在从jaxb迁移到使用jackson的xml封送的过程中,所以我认为问题可能在于如何将转换器添加到spring。json方面工作正常,只是xml导致了错误
我像这样将转换器添加到spring(在servlet配置类中):
@覆盖
public void configureMessageConverter(列表getMappingJacksonXmlConverter(){
返回新的MappingJackson2HttpMessageConverter(getJacksonXmlObjectMapper());
}
@Bean(name=“xmlMapper”)
公共XmlMapper getJacksonXmlObjectMapper(){
XmlMapper mapper=新的XmlMapper();
setDateFormat(新的SimpleDateFormat(“yyyy-MM-dd”);
返回映射器;
}
@豆子
公共Jackson2ObjectMapperBuilder getJackson2ObjectMapperBuilder(){
Jackson2ObjectMapperBuilder=新Jackson2ObjectMapperBuilder();
builder.indentOutput(true).dateFormat(新的SimpleDataFormat(“yyyy-MM-dd”);
builder.autoDetectFields(true);
builder.autodetecttgeterssetters(true);
annotationIntrospector(getJacksonAnnotationIntrospector());
返回生成器;
}
据我所知,我正确地添加了它们,但我看不出是什么导致了错误
欢迎提供任何帮助如何将
@responsebody
添加到公共Web服务响应getIndividualUser
方法
同样,在curl请求中使用GET方法中的
消耗部分或send内容类型也没有意义(它不消耗/发送任何内容)。我找到了解决问题的方法,我只需将支持的媒体类型添加到消息转换器中
public HttpMessageConverter<?> getMappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(getJackson2ObjectMapperBuilder().build());
converter.setSupportedMediaTypes(getSupportedJsonMediaTypes());
return converter;
}
public HttpMessageConverter<?> getMappingJacksonXmlConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(getJacksonXmlObjectMapper());
converter.setSupportedMediaTypes(getSupportedXmlMediaTypes());
return converter;
}
private List<MediaType> getSupportedJsonMediaTypes() {
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_JSON);
return mediaTypes;
}
private List<MediaType> getSupportedXmlMediaTypes() {
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_XML);
return mediaTypes;
}
公共HttpMessageConverter getMappingJackson2HttpMessageConverter(){
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter(GetJackson2Object MapperBuilder().build());
setSupportedMediaTypes(getSupportedJsonMediaTypes());
回流转换器;
}
公共HttpMessageConverter getMappingJacksonXmlConverter(){
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter(getJacksonXmlObjectMapper());
setSupportedMediaTypes(getSupportedXmlMediaTypes());
回流转换器;
}
私有列表getSupportedJsonMediaTypes(){
List mediaTypes=new ArrayList();
添加(MediaType.APPLICATION_JSON);
返回媒体类型;
}
私有列表getSupportedXmlMediaTypes(){
List mediaTypes=new ArrayList();
添加(MediaType.APPLICATION_XML);
返回媒体类型;
}
然后它像charm一样工作我的控制器用@RestController
注释,它应该将@ResponseBody
添加到内部的所有方法中
@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;
}
public HttpMessageConverter<?> getMappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(getJackson2ObjectMapperBuilder().build());
converter.setSupportedMediaTypes(getSupportedJsonMediaTypes());
return converter;
}
public HttpMessageConverter<?> getMappingJacksonXmlConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(getJacksonXmlObjectMapper());
converter.setSupportedMediaTypes(getSupportedXmlMediaTypes());
return converter;
}
private List<MediaType> getSupportedJsonMediaTypes() {
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_JSON);
return mediaTypes;
}
private List<MediaType> getSupportedXmlMediaTypes() {
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_XML);
return mediaTypes;
}