试图忽略MappingJakcson2HttpMessageConverter中无法识别的字段

时间:2016-12-21 16:12:22

标签: java spring

我有一个现有的基于Spring的REST客户端,我没有写,但我正在尝试修复。我们的一个远程REST服务在我们身上添加了一个字段,JSON解析中断了;我试图设置转换器,以便一般忽略未知字段。我在安装过程中执行了以下代码:

public void setRestTemplate(RestTemplate restTemplate) {
    restTemplate.getMessageConverters().add(new FormHttpMessageConverter());

    // configure the JSON converter to ignore unknown properties
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = jsonConverter.getObjectMapper(); // new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    restTemplate.getMessageConverters().add(jsonConverter);

    this.restTemplate = restTemplate;
}

我们在2.1.0版本中使用com.fasterxml.jackson.core,jackson-core,jackson-databind和jackson-annotations。

使用上面的代码,REST调用仍然失败并带有InvocationTargetException,"无法读取JSON:无法识别的字段"。如果我将字段提到对象中进行解组,则错误消失。

我使用了MappingJacksonHttpMessageConverter而不是MappingJackson2HttpMessageConverter的其他代码改编了上面的代码;那是问题吗?有了这个,该字段仍然不会被忽略,但如果我使用注释忽略未知属性,该字段将被忽略。不过,我宁愿把它放在映射器级别,以便它适用于所有具有单一配置的对象。

有没有人看到我在上述配置中做错了什么?

1 个答案:

答案 0 :(得分:1)

您要将新的MappingJackson2HttpMessageConverter实例添加到MessageConverters RestTemplate列表中,因此会有两个MappingJackson2HttpMessageConverter个实例。您可以通过将调试器放在restTemplate上来验证这一点。情况可能是MappingJackson2HttpMessageConverter的现有实例被拾取而不是自定义实例。要解决此问题,您可以删除现有实例并添加新实例,如下所示。

public void setRestTemplate(RestTemplate restTemplate) {
    //Remove existing MappingJackson2HttpMessageConverter from restTemplate
    final Iterator<HttpMessageConverter<?>> iterator = restTemplate.getMessageConverters().iterator();
        while(iterator.hasNext()){
            final HttpMessageConverter<?> converter = iterator.next();
            if(converter instanceof MappingJackson2HttpMessageConverter){
                iterator.remove();
                break;
            }
        }

    //Add new MappingJackson2HttpMessageConverter
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = jsonConverter.getObjectMapper(); 
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    restTemplate.getMessageConverters().add(jsonConverter);
    this.restTemplate = restTemplate;
}