2

我正在使用 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.Jackson2ObjectMapperBuilderserializationInclusion

@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);
    }
}

仍然没有布埃诺:-(

4

2 回答 2

1

有几种可能的方法来解决这个问题,其中一些在这里得到了清楚的解释:https ://www.baeldung.com/spring-boot-customize-jackson-objectmapper

一般来说,您可以:

  1. ObjectMapper通过创建自定义ObjectMapperbean 并将其标记为覆盖默认值@Primary(最简单的方法,但会严重影响您的应用程序,因为ObjectMapper您在代码中注入的所有实例都将默认使用这个,这可能对您有利或不利)

  2. 为此构建器定义自定义 beanJackson2ObjectMapperBuilder并正确设置serializationInclusion

  3. 在 Spring 中注册自定义 HTTP 消息转换器,它将通过定义 bean 来使用自定义 ObjectMapper MappingJackson2HttpMessageConverter(此转换器的构造函数接受ObjectMapper,因此您可以在那里传递正确配置的映射器)

于 2021-09-16T22:25:22.503 回答
1

看来@EnableWebMvc是罪魁祸首。我有一个WebMvcConfigurer看起来像这样的:

@Configuration
@EnableWebMvc // <----- this is the culprit!
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("OPTIONS", "GET", "POST", "PUT", "PATCH", "DELETE")
                .allowedOrigins("example.com")
                .allowedHeaders("*");
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    public InternalResourceViewResolver defaultViewResolver() {
        return new InternalResourceViewResolver();
    }

}

注释掉@EnableWebMvc可以让一切按预期工作。

于 2021-09-17T06:49:36.550 回答