Java 如何在Jackson中禁用fail\u on\u empty\u bean?

Java 如何在Jackson中禁用fail\u on\u empty\u bean?,java,jackson,Java,Jackson,使用jackson 2.1,如何禁用错误消息似乎希望我禁用的空bean上的fail\u 我假设这只是世界上最简单的事情,但现在已经很晚了,我还没有从api中找到一个简单的教程或任何特别明显的东西序列化工厂?为什么他们会让它如此不直观,然后让错误消息看起来如此简单 虽然我确实喜欢这个错误消息,但我的意思是,它比NPE好 我假设有一种方法可以使用注释来实现这一点,但我并不热衷于将它们用于我正在做的过于简单的工作 我相信,你可以在每个班级或全球范围内做这件事 对于每个类,请尝试@JsonSeriali

使用jackson 2.1,如何禁用错误消息似乎希望我禁用的空bean上的
fail\u

我假设这只是世界上最简单的事情,但现在已经很晚了,我还没有从
api
中找到一个简单的教程或任何特别明显的东西<代码>序列化工厂?为什么他们会让它如此不直观,然后让错误消息看起来如此简单

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


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

我相信,你可以在每个班级或全球范围内做这件事

对于每个类,请尝试@JsonSerialize上面的类声明

对于映射器,以下是一个示例:

ObjectMapper mapper=new ObjectMapper();
configure(SerializationFeature.FAIL\u ON\u EMPTY\u bean,false);
//做各种各样的事情,也许:
字符串someJsonString=mapper.writeValueAsString(someClassInstance);
SomeClass someClassInstance=mapper.readValue(someJsonString,SomeClass.class)
下面的StackOverflow链接还有一个Spring项目的示例

至于球衣的其他部分,我记不得了,但我相信这是相似的


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


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

您也可以使用
@JsonIgnoreProperties(ignoreUnknown=true)注释该类
要忽略类中未定义的字段

在我的例子中,我没有在导致此错误的一个字段中写入@JsonProperty注释

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

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

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

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

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
几乎相当于,

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

如果您使用的是Spring引导,则可以在application.properties文件中设置以下属性。 spring.jackson.serialization.FAIL\u ON\u EMPTY\u bean=false

ObjectMapper mapper = new ObjectMapper();

当我使用
mapper.configure(SerializationFeature.FAIL\u ON\u EMPTY\u bean,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

在Jersey Rest服务中,只需使用JacksonFeatures注释

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

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


如果是Spring应用程序,只需将代码粘贴到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;
        }
  

我今天早些时候用过这个,有更多信息,例如自动发现。你能举例说明如何使用
@JsonSerialize
在类声明中禁用
FAIL\u\u EMPTY\u bean
。这可能会有帮助:或者你可以使用ObjectMapper类的disable方法,比如“mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)”,如果整个bean实际上为空,这将不起作用。我正在尝试从我的spring boot REST应用程序中的一个控制器中返回JSON,这为我修复它。如果你有一个空对象,这是一个完美的方法!是的。解决了,很有魅力!
        @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;
        }