当我调用一个返回带有属性为空字符串的对象的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的。
答案 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;
}
}