使用 WebMvcConfigurationSupport 而不是 WebMvcConfigurerAdapter 返回空值

Null values returned using WebMvcConfigurationSupport instead of WebMvcConfigurerAdapter

由于 WebMvcConfigurerAdapter 从 Spring 5.0 开始被弃用,我已将其更改为 WebMvcConfigurationSupport,但我得到的响应为空值。

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

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

{
"name":"test"
}

Spring版本:5.7.0 杰克逊版本:2.9.7

我用谷歌搜索了很多东西,但仍然没有运气。我不想使用已弃用的 class。 添加 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);
    }

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

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

而是实施 WebMvcConfigurer,这也是 javadoc of `WebMvcConfigurerAdapter.

中弃用文档中的建议

Deprecated. as of 5.0 WebMvcConfigurer has default methods (made possible by a Java 8 baseline) and can be implemented directly without the need for this adapter

所以你的配置 class header 应该看起来像这样

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

您需要再次添加 @EnableWebMvc(因为它应该)和 override/implement 您需要使用的接口方法。在这种情况下可能只有一个。

PRO-TIP: 使用 Jackson2ObjectMapperBuilder 构建 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);
    }