我有一个现有的基于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的其他代码改编了上面的代码;那是问题吗?有了这个,该字段仍然不会被忽略,但如果我使用注释忽略未知属性,该字段将被忽略。不过,我宁愿把它放在映射器级别,以便它适用于所有具有单一配置的对象。
有没有人看到我在上述配置中做错了什么?
答案 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;
}