如何在杰克逊禁用fail_on_empty_beans?

问题描述 投票:0回答:15

使用 Jackson 2.1,如何禁用错误消息似乎希望我禁用的

fail_on_empty beans

我假设这只是世界上最简单的事情,但是现在已经晚了,我还没有找到一个简单的教程或任何从

api
中特别明显的东西。
SerializationFactory
?为什么他们要把它做得如此不直观,然后让错误消息看起来如此简单?

虽然我确实喜欢这个错误消息,但我的意思是,它比 NPE 更好。

我假设有一种方法可以使用注释来做到这一点 - 但我根本不热衷于使用它们来完成我正在做的简单工作!

java jackson
15个回答
175
投票

我相信,你可以在每个班级或全球范围内执行此操作。

对于每个类,尝试在类声明上方使用@JsonSerialize。

对于映射者,这是一个示例:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// do various things, perhaps:
String someJsonString = mapper.writeValueAsString(someClassInstance);
SomeClass someClassInstance = mapper.readValue(someJsonString, SomeClass.class)

下面的 StackOverflow 链接也有一个 Spring 项目的示例。

对于 REST with Jersey,我不记得了,但我相信它是相似的。


我挖出的几个链接:(由于 Codehaus 关闭而编辑了第一个链接)。


90
投票

如果您使用 Spring Boot,您可以在 application.properties 文件中设置以下属性。

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false


29
投票

如果您希望获取没有任何额外字段的 JSON 对象 - 请将此注释添加到您的类中,它对我来说非常适合。

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

您还可以在 application.properties 文件中添加此行,但它会向您的 JSON 添加一个额外的字段。

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

26
投票

如果您的类不包含任何公共方法/属性,您也可能会遇到同样的问题。我通常有专门用于 API 请求和响应的 DTO,声明为公开的,但在某种情况下也忘记将方法公开 - 这首先导致了“空”bean。


11
投票

您也可以使用

@JsonIgnoreProperties(ignoreUnknown=true)
注释类来忽略类中未定义的字段


7
投票

在 Jersey Rest Services 中只需使用 JacksonFeatures 注释...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}

6
投票

我不完全理解这个异常背后的原因,但是对于 Spring Boot 项目来说,将以下内容添加到属性文件中是一种享受

应用程序.yml

spring:
  jackson:
   serialization:
     FAIL_ON_EMPTY_BEANS: false

应用程序.属性

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

6
投票

要解决此问题,请配置您的 JsonDataFormat 类,如下所示

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

几乎等同于:

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

3
投票

就我而言,我错过了在导致此错误的字段之一中写入 @JsonProperty 注释。


3
投票

如果您使用 org.codehaus.jackson.map.ObjectMapper,那么请。使用以下行

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

2
投票

如果是Spring App,只需将代码粘贴到config类中即可

        @Bean
        public ObjectMapper getJacksonObjectMapper() {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.findAndRegisterModules();
            objectMapper.configure(
                    com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            return objectMapper;
        }
  

1
投票

在此处添加针对不同问题的解决方案,但会出现相同的错误...在动态构建 json(作为 api 响应或其他)时要小心,以转义字符串成员中的文字双引号。您可能正在使用自己格式错误的 json。


1
投票
ObjectMapper mapper = new ObjectMapper();

嗨,

当我使用

mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

我的 json 对象值在响应中的角度页面平均值为“空白”

已解决仅借助以下设置

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

1
投票

当我返回 InvoiceDTO 作为对客户端的响应时,我收到相同的错误。问题是当我在 DTO (InvoiceDTO) 中使用 bean (Customer) 时。因此,为了解决这个问题,我将 bean (Customer) 更改为 DTO (CustomerDTO) 以禁用序列化,并且工作正常。


-1
投票

就我而言,我不需要禁用它,而是必须将此代码放在我的类之上:(这解决了我的问题)

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)//this is what was added
    @Value //this was there already
    @Builder//this was there already

public class NameOfClass {
     //some code in here.
}
© www.soinside.com 2019 - 2024. All rights reserved.