Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson:@JsonCreator设置后写入的最后一个字段?_Java_Json_Security_Jackson - Fatal编程技术网

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
    也可以)
因此可能需要禁用一个或两个设置