如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?
Posted
技术标签:
【中文标题】如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?【英文标题】:How to change Jackson to detect all fields in a POJO, other than only public ones? 【发布时间】:2020-06-14 01:37:23 【问题描述】:在项目中使用 Spring Boot 时,Jackson 默认序列化对象来回和来自 Jsons。我意识到如果您没有公共访问器,例如 getter/setter 或 POJO 中的公共字段,Jackson 会失败。
当我切换到 Gson 时,行为有所不同。它检测所有字段,无论其可见性如何。出于这个原因,我最终使用了 Gson。
我对切换我的 POJO 访问规则感到有些不舒服;这将迫使对项目结构进行一些重构。
所以,使用 Gson 没有问题,但是有没有办法改变杰克逊的行为?
【问题讨论】:
【参考方案1】:尝试在 ObjectMapper 级别设置可见性,
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
【讨论】:
【参考方案2】:Jackson 确实支持从私有成员字段中读取值,但默认情况下不支持。
您可以在 Spring Boot 配置中全局配置行为
jackson:
visibility.field: any
visibility.getter: none
visibility.setter: none
visibility.is-getter: none
(此配置将只查找成员字段,不再检查 get、set 和 is 方法)
您还可以使用 @JsonAutoDetect 注释对特定类进行相同的设置。
【讨论】:
感谢您的回答。我在这个link 中找到了注释解决方案。不过,您的 Spring Boot 配置替代方案似乎更好。我只需要在一个地方改变行为,而不是到处散布注释。以上是关于如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?的主要内容,如果未能解决你的问题,请参考以下文章
如何在所有请求中传输动态auth值,而不是在SOAPUI中更改每个请求的标头中的值