空字符串反序列化的问题

时间:2017-06-16 09:47:57

标签: java json spring jackson

当我调用一个返回带有属性为空字符串的对象的Web服务时,我的Spring projet出现了问题。

在我的项目中,我有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();

如果我在浏览器中调用Web服务,则会返回此响应:

{
  "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
}

这是预期的结果。 但是当我在我的应用程序中调用此Web服务时,我获得了这个对象:

{
  "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
}

所有具有空值的属性现在都为null。 我认为有一些东西要配置,可能是ObjectMapper或JsonParser,但我不知道该怎么做。 目前我使用默认的Serializer,ObjectMapper和JsonParser。 我让Spring Boot进行自动配置。

如何配置我的应用程序以在反序列化对象时保留空字符串?

编辑:我通过向ObjectMapper添加一个模块进行字符串反序列化来尝试this solution,但是从不调用此方法。

编辑2:在BeanDeserializer类中,在反序列化期间,字段的JsonToken&#34; popin_type_code&#34;等于JsonToken.VALUE_NULL。 我不明白Spring / Jackson是如何产生这种JsonToken的。

2 个答案:

答案 0 :(得分:1)

尝试禁用ACCEPT_EMPTY_STRING_AS_NULL_OBJECT反序列化功能,但默认情况下不应该启用它,所以如果这是解决方案,我会感到惊讶。

import com.fasterxml.jackson.databind.DeserializationFeature;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class JacksonConfiguration {

    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();

        builder.featuresToDisable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

        return builder;
    }
}

答案 1 :(得分:0)

我终于找到了我的问题。

在我的应用程序中,我使用自定义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;
    }

}