使用WebMvcConfigurationSupport而不是WebMvcConfigurerAdapter返回的空值

时间:2019-06-03 21:46:28

标签: java spring spring-mvc jackson spring-annotations

由于从Spring 5.0开始不推荐使用WebMvcConfigurerAdapter,因此我将其更改为WebMvcConfigurationSupport,但在响应中却得到了空值。

{
"key": null,
"value": null,
"name":"test"
}

如果将其更改回WebMvcConfigurerAdapter,则会得到预期的响应:

{
"name":"test"
}

春季版本:5.7.0 杰克逊版本:2.9.7

我用Google搜索了很多东西,但还是没有运气。我不想使用不推荐使用的类。 尝试在添加WebMvcConfigurationSupport后删除@EnableWebMvc注释,因为这不是必需的。

我重写了configureMessageConverters,在其中设置了包含NOT_NULL的MappingJackson2HttpMessageConverter

@Configuration
@EnableAspectJAutoProxy
@EnableSwagger2
@PropertySource("classpath:test.properties")
@ComponentScan(basePackages = {"com.test.web"})
public class UmwWebConfig extends WebMvcConfigurationSupport {

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ByteArrayHttpMessageConverter bahHumbug = new ByteArrayHttpMessageConverter();
        bahHumbug.setSupportedMediaTypes(Collections.singletonList(MediaType.parseMediaType("application/pdf")));
        converters.add(bahHumbug);

        final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.getFactory().configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        converter.setObjectMapper(objectMapper);
        converters.add(converter);
        super.configureMessageConverters(converters);
    }

想要从响应中删除空字段。如果配置有任何问题,请告诉我。

1 个答案:

答案 0 :(得分:1)

请勿扩展WebMvcConfigurationSupport,因为这不等同于扩展已弃用的WebMvcConfigurerAdapter

代替实施WebMvcConfigurer,这也是javadoc of `WebMvcConfigurerAdapter的弃用文档中建议的。

  

已弃用。   从WebMvcConfigurer开始,@Configuration @EnableAspectJAutoProxy @EnableSwagger2 @EnableWebMvc @PropertySource("classpath:test.properties") @ComponentScan(basePackages = {"com.test.web"}) public class UmwWebConfig implements WebMvcConfigurer { ... } 具有默认方法(由Java 8基准实现),可以直接实现而无需此适配器

因此您的配置类标题应该看起来像这样

@EnableWebMvc

您需要再次添加Jackson2ObjectMapperBuilder(它应该`并重写/实现您需要使用的接口方法。在这种情况下,可能只有一个。)

PRO-TIP :使用ObjectMapper构建MappingJackson2HttpMessageConverter并使用ObjectMapper的构造函数。这样可以省去创建额外的@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { ByteArrayHttpMessageConverter bahHumbug = new ByteArrayHttpMessageConverter(); bahHumbug.setSupportedMediaTypes(Collections.singletonList(MediaType.parseMediaType("application/pdf"))); converters.add(bahHumbug); final ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() .serializationInclusion(JsonInclude.Include.NON_NULL) .failOnUnknownProperties(true) .featuresToEnable(JsonGenerator.Feature.ESCAPE_NON_ASCII) .build(); converters.add(new MappingJackson2HttpMessageConverter(objectMapper); super.configureMessageConverters(converters); } (在默认构造函数中发生)的麻烦。

$StockData | convertfrom-csv | convertto-json | ConvertFrom-Json -AsHashtable