spring.jackson.serialization。空豆失败

时间:2018-12-30 13:32:28

标签: java spring spring-boot jackson deserialization

我试图从doc上了解何时发生空bean失败:

  

公共静态最终序列化功能FAIL_ON_EMPTY_BEANS   一种功能,用于确定在找不到类型的访问器时会发生什么情况(并且没有注释指示它打算被序列化)。如果启用(默认),则将引发异常以指示这些类型为不可序列化的类型;如果禁用,它们将被序列化为空对象,即没有任何属性。   请注意,此功能仅对那些没有任何可识别批注的“空” bean(例如@JsonSerialize)起作用的空类型:具有批注的空类型不会导致引发异常。

     

默认情况下功能已启用。

现在我已经尝试创建一个空的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,我也总是使包装器序列化。谁能解释何时会发生错误?

1 个答案:

答案 0 :(得分: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;
}