Java Spring-cURLS不使用Jackson 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

我正在尝试设置我的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和控制器中的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;
}