Skip to content

JsonProperty.Access.READ_ONLY does not work with "getter-as-setter" Collections #2118

@zhangyangyu

Description

@zhangyangyu

I could still encounter the problem that JsonProperty.Access.READ_ONLY not work. I have read #1805 , and my jackson.databind version is 2.9.5. I also checked 2.9.6.

I have reduced my example as:

//AppTest.java
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

public class AppTest {
    @Test
    public void test() throws Exception {
        String data ="{\"security_group_rules\": [{\"id\": \"id1\"}, {\"id\": \"id2\"}, {\"id\": \"id3\"}, {\"id\": \"id4\"}]}";
        ObjectMapper mapper = new ObjectMapper();
        SecurityGroup sg = mapper.readValue(data, SecurityGroup.class);
        System.out.println(mapper.writeValueAsString(sg));
    }
}
//SecurityGroup.java
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.Lists;
import java.util.List;

public class SecurityGroup {

    private List<SecurityGroupRule> securityGroupRules;

    public SecurityGroup() {
        this.securityGroupRules = Lists.newArrayList();
    }

    @JsonProperty(value="security_group_rules", access=JsonProperty.Access.READ_ONLY)
    public List<SecurityGroupRule> getSecurityGroupRules() {
        return securityGroupRules;
    }

    public SecurityGroup setSecurityGroupRules(List<SecurityGroupRule> securityGroupRules) {
        this.securityGroupRules = securityGroupRules;
        return this;
    }
}
//SecurityGroupRule.java
import com.fasterxml.jackson.annotation.JsonProperty;

public class SecurityGroupRule {

    private String id;

    public SecurityGroupRule() {

    }

    @JsonProperty
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

I hope securityGroupRules won't be deserialized but it still is. If I change JsonProperty(value="security_group_rules", access=JsonProperty.Access.READ_ONLY) to JsonIgnoreProperties(value="security_group_rules", allowGetters=true) as metioned in #1805, it throws UnrecognizedPropertyException instead of printing {"security_group_rules":[{"id":"id1"},{"id":"id2"},{"id":"id3"},{"id":"id4"}]}. I'd like the former behaviour since in project I can set FAIL_ON_UNKNOWN_PROPERTIES to avoid the error.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions