我正在使用 spring-boot 2.5.4 并尝试default-property-inclusion=non_null全局设置,以便 null 值不再显示在我的 spring Web 服务器的响应中。
我已经spring.jackson.default-property-inclusion=non_null在我的项目中进行了配置,application.yml如前面的问题中所述。
spring:
jackson:
default-property-inclusion: non_null
不幸的是,我的控制器的输出中仍然包含空值:
{
"enabled": true,
"name": "foo",
"subdomain": null,
"tenantId": null
}
但是,如果我将非 null 直接添加到我的 dto 中,那么可行的是:
@Data
@NoArgsConstructor
@JsonInclude(Include.NON_NULL)
public class GlobalTenantGet {
private UUID tenantId;
private String name;
private String subdomain;
private boolean enabled;
}
屈服
{
"enabled": true,
"name": "foo"
}
正如预期的那样。
问题
为什么@JsonInclude在 dto 上本地配置会导致 null 属性按预期消失,但为什么配置spring.jackson.default-property-inclusion=non_null没有相同的效果?
附加信息
1. 调试
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.JacksonObjectMapperConfiguration#jacksonObjectMapper在显示中设置断点,配置的属性application.yaml确实使它成为杰克逊:
ObjectMapper2.控制器中的自动装配
ObjectMapper在我的控制器中自动装配并直接通过objectMapper.writeValueAsString().
其他配置方法ObjectMapper
这些主要是对Pawel Woroniecki的回答
1. 使用@primary
我有一个
@Configuration
public class ObjectMapperConfiguration {
@Primary
@Bean
public ObjectMapper objectMapper() {
final var om = new ObjectMapper();
om.setSerializationInclusion(Include.NON_NULL);
return om;
}
}
仍然在输出中包含 null 属性
2.Jackson2ObjectMapperBuilder与serializationInclusion
@Configuration
public class ObjectMapperConfiguration {
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return new Jackson2ObjectMapperBuilder().serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
仍然产生
{
"enabled": true,
"name": "foo",
"subdomain": null,
"tenantId": null
}
3.定义MappingJackson2HttpMessageConverter
@Configuration
public class ObjectMapperConfiguration {
@Bean
public MappingJackson2HttpMessageConverter messageMappingConverter() {
final var om = new ObjectMapper();
om.setSerializationInclusion(Include.NON_NULL);
return new MappingJackson2HttpMessageConverter(om);
}
}
仍然没有布埃诺:-(
