gpt4 book ai didi

java - Jackson:在@JsonCreator 设置后写入最终字段?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:52 26 4
gpt4 key购买 nike

Jackson 似乎使用反射将附加属性直接写入字段,即使 @JsonCreator使用了构造函数,该字段标记为 final .

例子:

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: expected:<[s]> but was:<[t]> .

是否在任何地方记录了这种行为?无论如何要在全局范围内禁用它?

此外,我认为这是一个非常危险的设计:如果有一些值对客户端来说应该是只读的,这实际上允许客户端设置它们,即使类是根据正常的不可变类指南精心设计的.

最佳答案

首先:是的,Jackson 允许反序列化所有可见的,而不仅仅是那些存在 @JsonCreator 属性的。因此,可以通过构造函数设置较小的一组属性,而通过 setter 或字段设置其他属性。这对于循环类型等某些情况可能是必需的。

关于这里如何防止使用进行反序列化。一个明显的方法是为字段添加 @JsonIgnore,尽管如果是这样,您还需要为 getS() 添加 @JsonProperty 以避免两者都被删除.

但是在 MapperFeature 中还有其他设置。

  • ALLOW_FINAL_FIELDS_AS_MUTATORS:如果禁用此功能,final 字段永远不会直接用于反序列化
  • INFER_PROPERTY_MUTATORS:如果禁用此功能,则在它们不可见的情况下,无论是字段还是 setter 都不会被“拉入”(对于字段,需要 public可见;对于 setter,即使 private 也可以)

因此可能想要禁用一个或两个设置。

关于java - Jackson:在@JsonCreator 设置后写入最终字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30351904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com