spring.jackson.serialization.fail-on-empty-beans

Posted

技术标签:

【中文标题】spring.jackson.serialization.fail-on-empty-beans【英文标题】: 【发布时间】:2019-05-27 10:19:11 【问题描述】:

我试图了解空 bean 何时发生故障,来自文档:

public static final SerializationFeature FAIL_ON_EMPTY_BEANS 确定在没有找到类型的访问器时会发生什么的功能(并且没有注释表明它应该被序列化)。如果启用(默认),则抛出异常以指示这些为不可序列化类型;如果禁用,它们将被序列化为空对象,即没有任何属性。 请注意,此功能仅对那些没有任何可识别注释(如@JsonSerialize)的“空”bean 产生影响的空类型:具有注释的空类型不会导致抛出异常。

功能默认启用。

现在我尝试创建一个空 POJO(没有 getters):

@Component
public class Wrapper2 

    private String name;


我要序列化的包装类:

@Component
public class Wrapper 

        @Autowired
        private Wrapper2 wrapper2;



控制器:

@RestController
public class TestController 
    @Autowired
    private Wrapper wrapper;

        @GetMapping("/test")
        public Wrapper test() 
          return wrapper;
        
    

但是,即使添加/删除 wrapper2 的 getter 和 setter,我也总是会序列化包装器。谁能解释一下什么时候会发生错误?

【问题讨论】:

空豆在哪里? @user7294900 根据文档,任何没有访问器的“在找不到类型的访问器时发生”我没有 wrapperwrapper2 的吸气剂 【参考方案1】:

您需要您的 bean 为空并且没有可识别的注释

请注意,此功能仅对那些没有任何可识别注释的“空”bean 产生影响的空类型

因此,如果您删除注释,它将失败

public class Wrapper 


错误将是

Unrecognized field "wrapper" (class com.Wrapper ), not marked as ignorable (0 known properties: ])

Jackson标记为UnknownSerializer时应用的相关代码:

if (isEnabled(SerializationFeature.FAIL_ON_EMPTY_BEANS)) 
        if (ser instanceof UnknownSerializer) 
            return true;

嵌套空类的类似异常:

public class Wrapper 
   private Wrapper2 wrapper2;

【讨论】:

以上是关于spring.jackson.serialization.fail-on-empty-beans的主要内容,如果未能解决你的问题,请参考以下文章