Java Jackson:@JsonCreator设置后写入的最后一个字段?
即使使用了Java Jackson:@JsonCreator设置后写入的最后一个字段?,java,json,security,jackson,Java,Json,Security,Jackson,即使使用了@JsonCreator构造函数,并且字段标记为final,Jackson似乎也使用反射将附加属性直接写入字段中 例如: public class Test { static class X { final String s; @JsonCreator public X(@JsonProperty("a") String a) { s = "s"; } public St
@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:expected:but was:
这种行为是否有记录在案?是否有全局禁用此功能的方法
另外,我认为这是一个非常危险的设计:如果有一些值应该是客户端只读的,那么这实际上允许客户端设置这些值,即使类是根据正常的不可变类准则设计的。首先:是,Jackson允许反序列化所有可见内容,而不仅仅是那些
@JsonCreator
属性存在的内容。因此,可以通过构造函数设置较小的属性集,通过setter或字段设置其他属性集。在某些情况下,如循环类型,可能需要这样做
关于如何防止在此处使用s
进行反序列化。一个明显的方法是为字段添加@JsonIgnore
,尽管如果是这样,您还需要为getS()
添加@JsonProperty
,以避免两者都被删除
但在MapperFeature
中还有其他设置
:如果禁用此选项,ALLOW_FINAL_FIELDS_AS_MUTATORS
字段永远不会直接用于反序列化FINAL
:如果禁用此选项,则在字段和设置器不可见的情况下,它们都不会“拉入”(对于字段,infere\u PROPERTY\u MUTATORS
需要可见;对于设置器,即使是public
也可以)private