【问题标题】:Spring - cURLS not deserializing with Jackson XML MapperSpring - cURLS 不使用 Jackson XML Mapper 反序列化
【发布时间】: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

【问题讨论】:

    标签: java json xml spring curl


    【解决方案1】:

    @ReponseBody 添加到public WebServiceResponse getIndividualUser 方法怎么样?

    在 GET 方法中也有 consumes 部分或在 curl 请求中发送 Content-Type 没有意义(它不消耗/发送任何东西)。

    【讨论】:

    • 我的控制器用@RestController注解,应该把@ResponseBody添加到里面的所有方法中
    【解决方案2】:

    我想出了如何解决这个问题,我只需将支持的媒体类型添加到消息转换器。

    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;
    }
    

    然后它就像魅力一样发挥作用

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 2018-08-15
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多