当前位置: 首页 > 知识库问答 >
问题:

Spring boot jackson non_null属性不工作

金晗日
2023-03-14

我使用的是Spring boot 1.5.7版本。

我正在尝试在应用程序中设置全局非空Jackson属性。

但它不起作用。

这两种方法我都试过了。属性和引导。但不起作用。

spring.jackson.default-property-inclusion=NON_NULL
spring.jackson.serialization-inclusion=NON_NULL

但当我申请班级级别时,它运行良好。

@JsonInclude(JsonInclude.NON_NULL)

共有3个答案

苍宜修
2023-03-14

我只是在处理application.properties中的设置,两者都没有。在我的例子中,我正在扩展一个抽象配置类,它定义了一个具有完全不同设置的ObjectMapperbean。所以我必须覆盖它。

让我找到它的地方是使用Spring Boot应用程序拥有的/beans执行器endpoint,并搜索“ObjectMapper”。它揭示了一个我不知道的实例正在被创建。

长孙作人
2023-03-14

也许我去派对迟到了,但这可能会对某人有所帮助。

扩展WebMvcConfigurationSupport类,并根据需要定制Springboot配置

@Configuration
public class Config extends WebMvcConfigurationSupport{

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        converter.setObjectMapper(mapper);
        converters.add(converter);
        super.configureMessageConverters(converters);
    }
}
邬英武
2023-03-14

根据文件,正确答案是:

spring.jackson.default-property-inclusion=non_null

(注意小写non_null-这可能是你的问题的原因)

编辑:我创建了一个简单的Spring Boot 1.5.7。发布项目时,只需要以下两个编译依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency> 

然后我添加了以下控制器和响应类(使用Lombok跳过一些样板代码):

@RestController
@RequestMapping("/jackson")
public class JacksonTestController {

    @GetMapping("/test")
    public Response test() {
        val response = new Response();
        response.setField1("");

        return response;
    }
}

@Data
class Response {
    private String field1;
    private String field2;
    private Integer field3;
}

最后,我根据文档配置了Jackson,运行应用程序并导航到http://localhost:8080/jackson/test。结果是(正如预期的那样):

{"field1":""}

之后,我深入研究了Spring Boot的源代码,发现Spring使用classorg。springframework。http。转换器。json。Jackson2ObjectMapperBuilder创建com的实例。fasterxml。杰克逊。数据绑定。ObjectMapper。然后我在方法public中设置了一个断点

我发现在应用程序启动期间创建了8个ObjectMapper实例,其中只有一个是使用应用程序的内容配置的。属性文件。OP从未具体说明他是如何使用序列化的,所以他的代码可能引用了其他7个可用的对象映射器之一。

无论如何,确保应用程序中的所有对象映射器配置为仅序列化非空属性的唯一方法是创建自己的类org副本。springframework。http。转换器。json。Jackson2ObjectMapperBuilder和etiher硬编码,将该选项作为默认选项,或自定义类以读取应用程序。属性在每次调用其构造函数或生成方法时。

 类似资料:
  • 我正在使用log4j 2.4,并尝试将转换为,但是似乎不能使用log4j2.properties。 null 虽然以下文档https://logging.apache.org/log4j/2.x/manual/configuration.html#属性 清楚地表明 属性配置文件支持广告客户、monitorInterval、name、packages、shutdownHook、status 我也尝试

  • 从最新版本开始,我就体验到了Chrome的一些意想不到的行为:在Firefox中,这段代码运行得非常好: 它不工作在Chrome(简单地下载一个名为下载的文件),但以前工作得很好。我必须改变什么,它又开始工作了?

  • 我想让一个svg文本可编辑。经过一番研究,我发现editable属性可以指定svg元素的内容是否可以编辑到位(http://www.w3.org/tr/2004/wd-SVG12-20041027/text.html)。 所以我试着: 但是,我还是不能编辑它!(我使用了最新版本的谷歌Chrome,Firefox和IE)

  • 我有以下XML 我有以下freemarker模板,其中xml元素被注入为“元素”。

  • 我正在使用spring加载属性文件 当我使用 工作正常。 但是当我尝试使用env时

  • 试图让spring boot@ConfigurationProperties注释工作起来,这让我感到非常困难。所以希望有人能为我澄清我做错了什么。我有一个Spring Boot应用程序,它在类路径上包含一个application.properties。它的价值在于 我有一个application.class,它有spring boot注释,位于包层次结构的顶部 有人告诉我我做错了什么吗? 更新: