如何在 Jackson 中禁用 fall_on_void_beans?

使用 Jackson 2.1,我如何禁用 fail_on_empty beans,错误消息似乎想让我禁用它?

我假设这只是世界上最简单的东西,但该死的现在已经很晚了,我还没有能够找到一个简单的教程或任何特别明显从 apiSerializationFactory?为什么他们让它如此不直观,然后使错误消息看起来如此简单?

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

我假设有一种方法可以使用注释来实现这一点-但是我并不热衷于将它们用于我正在做的简单工作!

204353 次浏览

我相信你可以在每个班级或者全球范围内这样做。

对于每个类,尝试@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 项目的示例。

至于使用 Jersey 进行 REST,我不记得我是怎么想的了,但是我相信它们是相似的。


我找到了几个链接: (由于 Codehaus 关闭,编辑了第一个链接)。

如果类不包含任何公共方法/属性,也可能出现同样的问题。我通常为 API 请求和响应专门设置 DTO,声明为 public,但是在一种情况下忘记将方法也设置为 public ——这首先导致了“空”bean。

您还可以使用 @JsonIgnoreProperties(ignoreUnknown=true)对类进行注释,以忽略类中未定义的字段

在我的例子中,我错过了在导致此错误的字段之一中编写@JsonProperty 注释。

如果使用 org.codehaus.jackson.map. ObjectMapper,请使用以下代码行

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

在这里为另一个问题添加一个解决方案,但是这个解决方案显示了相同的错误... ... 在动态构造 json (作为 api 响应或其他方式)以转义字符串成员中的文字双引号时要小心。你可能正在吞噬你自己畸形的 Json。

为了解决这个问题,请配置您的 JsonDataFormat 类,如下所示

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

几乎相当于,

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

如果使用 Spring Boot,可以在 application.properties 文件中设置以下属性。 spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

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

如果你想得到没有任何额外字段的 JSON 对象-请将这个注释添加到你的类中,它对我来说非常有用。

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

您还可以将这一行添加到 application.properties 文件中,但是它将向您的 JSON 添加一个额外的字段。

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

在新泽西休息服务中,只要使用杰克逊特性注释..。

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

在我的例子中,我不需要禁用它,而是必须将这段代码放在类的顶部: (这解决了我的问题)

    @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.
}

如果是 Spring 应用程序,只需将代码粘贴到配置类中

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

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

应用

spring:
jackson:
serialization:
FAIL_ON_EMPTY_BEANS: false

应用性能

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

当我返回 InvoiceDTO 作为对客户端的响应时,我会得到相同的错误。问题出在我在 DTO (InvoiceDTO)中使用 bean (Customer)时。因此,为了解决这个问题,我将 bean (Customer)更改为 DTO (CustomerDTO)以禁用序列化,这样就可以很好地工作了。