使用 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);
}
由于 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);
}