java-杰克逊:@JsonCreator设置后写入的最终字段?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-杰克逊:@JsonCreator设置后写入的最终字段?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1338字,纯文字阅读大概需要2分钟。
内容图文
![java-杰克逊:@JsonCreator设置后写入的最终字段?](/upload/InfoBanner/zyjiaocheng/681/03f85138cf6e435198e58487518ccc00.jpg)
即使使用@JsonCreator构造函数并将该字段标记为final,Jackson似乎还是使用反射将其他属性直接写入字段中.
例:
public class Test {
static class X {
final String s;
@JsonCreator
public X(@JsonProperty("a") String a) {
s = "s";
}
public String getS() {
return s;
}
}
@org.junit.Test
public void ds() throws Exception {
ObjectMapper om = new ObjectMapper();
X x = om.readValue("{`a`:``, `s`: `t`}".replace('`', '"'), X.class);
assertEquals("s", x.s);
}
}
该断言将因org.junit.ComparisonFailure失败:预期的:< [s]>但是是:[[t]>.
此行为记录在任何地方吗?反正有全局禁用此功能吗?
另外,我认为这是一个非常危险的设计:如果有些值对客户端是只读的,那么即使该类按照正常的不可变类指南进行了精心设计,也可以有效地允许客户端设置它们.
解决方法:
第一:是的,Jackson允许对所有可见对象进行反序列化,而不仅仅是对@JsonCreator属性存在的对象进行反序列化.因此,可以通过构造函数设置较小的属性集,而通过setter或字段设置其他属性.在某些情况下,例如循环类型,可能需要这样做.
至于如何防止使用s进行反序列化.一种明显的方法是为字段添加@JsonIgnore,尽管如此,您还需要为getS()使用@JsonProperty以避免两者都被删除.
但是,在MapperFeature中还有其他设置.
> ALLOW_FINAL_FIELDS_AS_MUTATORS:如果禁用此选项,则最终字段永远不会直接用于反序列化
> INFER_PROPERTY_MUTATORS:如果禁用此设置,则在其他情况下都不可见的情况下,字段和设置器都不会被“拉入”(对于字段,需要公开;对于设置器,即使是私有也可以)
因此可能要禁用一项或两项设置.
内容总结
以上是互联网集市为您收集整理的java-杰克逊:@JsonCreator设置后写入的最终字段?全部内容,希望文章能够帮你解决java-杰克逊:@JsonCreator设置后写入的最终字段?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。