我试图从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,我也总是使包装器序列化。谁能解释何时会发生错误?
答案 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;
}