当我调用一个返回属性为空字符串的对象的 Web 服务时,我的 Spring 项目遇到了问题。
在我的项目中,我有 Spring boot 1.5.2、Spring 4.3.7 和 Jackson 2.8.7。
我使用 RestTemplate 来调用 Web 服务。
ResponseEntity<T> responseEntity = restTemplate.exchange("web-service-HttpMethod.GET, null, MyObject.Class);
return responseEntity.getBody();
如果我在浏览器中调用网络服务,它会返回以下响应:
{
"display_item_code": "NEP054",
"historic": false,
"popin_type_code": "",
"combo_box": false,
"max_combo_box_elements": 0,
"data_max_length": 0,
"data_precision": 0,
"data_min_length": 0,
"data_control_type_code": "",
"data_control_value1": "",
"data_control_value2": "",
"data_format": "MAJUS",
"translatable": false,
"translation_key_type_code": "",
"default_value_setting": "",
"default_value": "",
"text_area": false,
"family_code": "",
"popin": null,
"combo_values": null
}
这就是预期的结果。 但是当我在应用程序中调用这个网络服务时,我获得了这个对象:
{
"display_item_code": "NEP054",
"historic": false,
"popin_type_code": null,
"combo_box": false,
"max_combo_box_elements": 0,
"data_max_length": 0,
"data_precision": 0,
"data_min_length": 0,
"data_control_type_code": null,
"data_control_value1": null,
"data_control_value2": null,
"data_format": "MAJUS",
"translatable": false,
"translation_key_type_code": null,
"default_value_setting": null,
"default_value": null,
"text_area": false,
"family_code": null,
"popin": null,
"combo_values": null
}
所有具有空值的属性现在都为空。 我认为需要配置一些东西,也许是 ObjectMapper 或 JsonParser,但我不知道该怎么做。 目前我使用默认的 Serializer、ObjectMapper 和 JsonParser。 我让 Spring Boot 进行自动配置。
如何将应用程序配置为在反序列化对象时保留空字符串?
编辑:我尝试过 this solution通过向 ObjectMapper 添加一个模块来进行字符串反序列化,但永远不会调用此方法。
编辑2:在BeanDeserializer类中,在反序列化期间,字段“popin_type_code”的JsonToken等于JsonToken.VALUE_NULL。 我不明白 Spring/Jackson 如何生成这个 JsonToken。
最佳答案
我终于找到了我的问题所在。
在我的应用程序中,我使用自定义 RestTemplate。但是这个CustomRestTemplate使用Spring RestTemplate类的默认构造函数。因此它使用默认的 MessageConverter 列表。
解决方案是为我的 CustomRestTemplate 添加一个构造函数,并将 MessageConverter 列表作为输入。
@Component
public class CustomRestTemplate extends RestTemplate {
@Autowired
public CustomRestTemplate (List<HttpMessageConverter<?>> messageConverters) {
super(messageConverters);
}
}
并配置转换器禁用“ACCEPT_EMPTY_STRING_AS_NULL_OBJECT”功能:
@Configuration
@ComponentScan(basePackages = "com.geodis.rt")
public class WebApplicationConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters( List<HttpMessageConverter<?>> converters ) {
converters.add(0, converter());
}
@Bean
MappingJackson2HttpMessageConverter converter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.getObjectMapper().disable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
return converter;
}
}
关于java - 空字符串反序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44586126/