java - 空字符串反序列化问题

标签 java json spring jackson

当我调用一个返回属性为空字符串的对象的 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/

相关文章:

c# - .net 中是否存在将 JSON 解析为 Dictionary<String,Object> 的现有库?

java - SQL 中的名称按字母顺序排列

java - 自定义 WebArgumentResolver,如 @PathVariable

java - Spring DI : Injection of FileInputStream in Constructor using annotation

java - eclipse 用于在其 Debug模式下启动 java 进程的默认属性是什么?

javascript - 将 JSON 数据解析为 HTML

c# - 如何在使用 Json.net 库将新记录写入现有的 json 文件时保持 json 文件格式有效?

java - 如何监控Spring对象创建?

java - 如何从 ScheduledFuture 任务获取委托(delegate)

java - 在 Spring MVC 应用程序中修复 Null EntityManger?