Java 将JsonCreator与JsonProperty.Access.READ_一起使用时发生InvalidDefinitionException

Java 将JsonCreator与JsonProperty.Access.READ_一起使用时发生InvalidDefinitionException,java,spring-boot,jackson,deserialization,jackson2,Java,Spring Boot,Jackson,Deserialization,Jackson2,尝试使用@JsonCreator和@JsonProperty(value=“version”,access=JsonProperty.access.READ\u)时,我遇到了InvalidDefinitionException 我的班级是这样的: @Entity public class Example1 implements Serializable { private String field1; private int field2; private Example2 fie

尝试使用
@JsonCreator
@JsonProperty(value=“version”,access=JsonProperty.access.READ\u)时,我遇到了InvalidDefinitionException

我的班级是这样的:

@Entity
public class Example1 implements Serializable {

  private String field1;
  private int field2;
  private Example2 field3;

  public Example1(@JsonProperty(value = "field_1", access = JsonProperty.Access.READ_WRITE) String field1,
  @JsonProperty(value = "field_2", access = JsonProperty.Access.READ_ONLY) int field2,
  @JsonProperty(value = "field_3_1", access = JsonProperty.Access.READ_WRITE) String field31,
  @JsonProperty(value = "field_3_2", access = JsonProperty.Access.READ_WRITE) int field32
  ) {
    this.field1 = field1;
    this.field2 = field2;
    this.field3 = new Example2(field31, field32);
  }

  // getters and setters omitted
}
它将引发以下异常:

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Argument #1 of constructor [constructor for com.test.example.model.Example1, annotations: {interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
 at [Source: (File); line: 1, column: 1]
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:62) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:249) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:165) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:411) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4145) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3995) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2878) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
我的环境详情: 我使用的是
springboot2.0.0.M2
版本和
jackson2.9.0.pr3

我的意图是在反序列化期间省略字段2


我尝试在字段2的setter方法中使用
@JsonIgnore
作为替代方法。甚至,它也不适用于
@JsonCreator

反序列化时有两种方法可以忽略该属性

  • 使用只读
  • 只需向不希望反序列化的属性添加注释

    @JsonProperty(access = Access.READ_ONLY)
    private String readOnly;
    
  • 使用@JsonIgnore和@JsonProperty
  • 这个方法应该小心,应该将@JsonIgnore放在setter之前,并将@JsonProperty放在getter之前。而对于属性,则应清除,无任何注释

    @JsonProperty
    public String getJsonIgnoreSetter() {
        return jsonIgnoreSetter;
    }
    
    @JsonIgnore
    public void setJsonIgnoreSetter(String jsonIgnoreSetter) {
        this.jsonIgnoreSetter = jsonIgnoreSetter;
    }
    
    最后,给出了@JsonIgnore、@JsonProperty、@JsonProperty(access=xxx)的完整注释示例

    bean的定义

    public class MockBean{
    
        public MockBean() {
            super(MockBean.class);
        }
    
        public MockBean(String attr1, String ignore, String jsonIgnore, String jsonIgnoreGetter,
                String jsonIgnoreSetter, String jsonIgnoreProperties, String jsonIgnorePropertiesSetter,
                String jsonIgnorePropertiesGetter, String readOnly, String writeOnly) {
            super(MockBean.class);
            this.attr1 = attr1;
            this.ignore = ignore;
            this.jsonIgnore = jsonIgnore;
            this.jsonIgnoreGetter = jsonIgnoreGetter;
            this.jsonIgnoreSetter = jsonIgnoreSetter;
            this.jsonIgnoreProperties = jsonIgnoreProperties;
            this.jsonIgnorePropertiesSetter = jsonIgnorePropertiesSetter;
            this.jsonIgnorePropertiesGetter = jsonIgnorePropertiesGetter;
            this.readOnly = readOnly;
            this.writeOnly = writeOnly;
        }
    
        public String getAttr1() {
            return attr1;
        }
    
        public void setAttr1(String name) {
            this.attr1 = name;
        }
    
        public String getIgnore() {
            return ignore;
        }
    
        public void setIgnore(String ignore) {
            this.ignore = ignore;
        }
    
        public String getJsonIgnore() {
            return jsonIgnore;
        }
    
        public void setJsonIgnore(String jsonIgnore) {
            this.jsonIgnore = jsonIgnore;
        }
    
        @JsonIgnore
        public String getJsonIgnoreGetter() {
            return jsonIgnoreGetter;
        }
    
        @JsonProperty
        public void setJsonIgnoreGetter(String jsonIgnoreGetter) {
            this.jsonIgnoreGetter = jsonIgnoreGetter;
        }
    
        @JsonProperty
        public String getJsonIgnoreSetter() {
            return jsonIgnoreSetter;
        }
    
        @JsonIgnore
        public void setJsonIgnoreSetter(String jsonIgnoreSetter) {
            this.jsonIgnoreSetter = jsonIgnoreSetter;
        }
    
        public String getJsonIgnoreProperties() {
            return jsonIgnoreProperties;
        }
    
        public void setJsonIgnoreProperties(String jsonIgnoreProperties) {
            this.jsonIgnoreProperties = jsonIgnoreProperties;
        }
    
        public String getJsonIgnorePropertiesSetter() {
            return jsonIgnorePropertiesSetter;
        }
    
        @JsonIgnoreProperties
        public void setJsonIgnorePropertiesSetter(String jsonIgnorePropertiesSetter) {
            this.jsonIgnorePropertiesSetter = jsonIgnorePropertiesSetter;
        }
    
        @JsonIgnoreProperties
        public String getJsonIgnorePropertiesGetter() {
            return jsonIgnorePropertiesGetter;
        }
    
        public void setJsonIgnorePropertiesGetter(String jsonIgnorePropertiesGetter) {
            this.jsonIgnorePropertiesGetter = jsonIgnorePropertiesGetter;
        }
    
        public String getReadOnly() {
            return readOnly;
        }
    
        public void setReadOnly(String readOnly) {
            this.readOnly = readOnly;
        }
    
        public String getWriteOnly() {
            return writeOnly;
        }
    
        public void setWriteOnly(String writeOnly) {
            this.writeOnly = writeOnly;
        }
    
        private String attr1;
        @Ignore
        private String ignore;
        @JsonIgnore
        private String jsonIgnore;
        @JsonIgnore
        private String jsonIgnoreGetter;
        @JsonIgnore
        private String jsonIgnoreSetter;
        @JsonIgnoreProperties
        private String jsonIgnoreProperties;
        private String jsonIgnorePropertiesSetter;
        private String jsonIgnorePropertiesGetter;
        @JsonProperty(access = Access.READ_ONLY)
        private String readOnly;
        @JsonProperty(access = Access.WRITE_ONLY)
        private String writeOnly;
    }
    
    测试JSON

    {
      "name": "name",
      "description": "description",
      "attr1":"attr1",
      "ignore": "ignore",
      "jsonIgnore": "jsonIgnore",
      "jsonIgnoreGetter": "jsonIgnoreGetter",
      "jsonIgnoreSetter": "jsonIgnoreSetter",
      "jsonIgnoreProperties": "jsonIgnoreProperties",
      "jsonIgnorePropertiesSetter": "jsonIgnorePropertiesSetter",
      "jsonIgnorePropertiesGetter": "jsonIgnorePropertiesGetter",
      "readOnly": "readOnly",
      "writeOnly": "writeOnly"
    }
    
    反序列化的结果:如果该值为null,则该值不会被反序列化


    反序列化时有两种方法可以忽略该属性

  • 使用只读
  • 只需向不希望反序列化的属性添加注释

    @JsonProperty(access = Access.READ_ONLY)
    private String readOnly;
    
  • 使用@JsonIgnore和@JsonProperty
  • 这个方法应该小心,应该将@JsonIgnore放在setter之前,并将@JsonProperty放在getter之前。而对于属性,则应清除,无任何注释

    @JsonProperty
    public String getJsonIgnoreSetter() {
        return jsonIgnoreSetter;
    }
    
    @JsonIgnore
    public void setJsonIgnoreSetter(String jsonIgnoreSetter) {
        this.jsonIgnoreSetter = jsonIgnoreSetter;
    }
    
    最后,给出了@JsonIgnore、@JsonProperty、@JsonProperty(access=xxx)的完整注释示例

    bean的定义

    public class MockBean{
    
        public MockBean() {
            super(MockBean.class);
        }
    
        public MockBean(String attr1, String ignore, String jsonIgnore, String jsonIgnoreGetter,
                String jsonIgnoreSetter, String jsonIgnoreProperties, String jsonIgnorePropertiesSetter,
                String jsonIgnorePropertiesGetter, String readOnly, String writeOnly) {
            super(MockBean.class);
            this.attr1 = attr1;
            this.ignore = ignore;
            this.jsonIgnore = jsonIgnore;
            this.jsonIgnoreGetter = jsonIgnoreGetter;
            this.jsonIgnoreSetter = jsonIgnoreSetter;
            this.jsonIgnoreProperties = jsonIgnoreProperties;
            this.jsonIgnorePropertiesSetter = jsonIgnorePropertiesSetter;
            this.jsonIgnorePropertiesGetter = jsonIgnorePropertiesGetter;
            this.readOnly = readOnly;
            this.writeOnly = writeOnly;
        }
    
        public String getAttr1() {
            return attr1;
        }
    
        public void setAttr1(String name) {
            this.attr1 = name;
        }
    
        public String getIgnore() {
            return ignore;
        }
    
        public void setIgnore(String ignore) {
            this.ignore = ignore;
        }
    
        public String getJsonIgnore() {
            return jsonIgnore;
        }
    
        public void setJsonIgnore(String jsonIgnore) {
            this.jsonIgnore = jsonIgnore;
        }
    
        @JsonIgnore
        public String getJsonIgnoreGetter() {
            return jsonIgnoreGetter;
        }
    
        @JsonProperty
        public void setJsonIgnoreGetter(String jsonIgnoreGetter) {
            this.jsonIgnoreGetter = jsonIgnoreGetter;
        }
    
        @JsonProperty
        public String getJsonIgnoreSetter() {
            return jsonIgnoreSetter;
        }
    
        @JsonIgnore
        public void setJsonIgnoreSetter(String jsonIgnoreSetter) {
            this.jsonIgnoreSetter = jsonIgnoreSetter;
        }
    
        public String getJsonIgnoreProperties() {
            return jsonIgnoreProperties;
        }
    
        public void setJsonIgnoreProperties(String jsonIgnoreProperties) {
            this.jsonIgnoreProperties = jsonIgnoreProperties;
        }
    
        public String getJsonIgnorePropertiesSetter() {
            return jsonIgnorePropertiesSetter;
        }
    
        @JsonIgnoreProperties
        public void setJsonIgnorePropertiesSetter(String jsonIgnorePropertiesSetter) {
            this.jsonIgnorePropertiesSetter = jsonIgnorePropertiesSetter;
        }
    
        @JsonIgnoreProperties
        public String getJsonIgnorePropertiesGetter() {
            return jsonIgnorePropertiesGetter;
        }
    
        public void setJsonIgnorePropertiesGetter(String jsonIgnorePropertiesGetter) {
            this.jsonIgnorePropertiesGetter = jsonIgnorePropertiesGetter;
        }
    
        public String getReadOnly() {
            return readOnly;
        }
    
        public void setReadOnly(String readOnly) {
            this.readOnly = readOnly;
        }
    
        public String getWriteOnly() {
            return writeOnly;
        }
    
        public void setWriteOnly(String writeOnly) {
            this.writeOnly = writeOnly;
        }
    
        private String attr1;
        @Ignore
        private String ignore;
        @JsonIgnore
        private String jsonIgnore;
        @JsonIgnore
        private String jsonIgnoreGetter;
        @JsonIgnore
        private String jsonIgnoreSetter;
        @JsonIgnoreProperties
        private String jsonIgnoreProperties;
        private String jsonIgnorePropertiesSetter;
        private String jsonIgnorePropertiesGetter;
        @JsonProperty(access = Access.READ_ONLY)
        private String readOnly;
        @JsonProperty(access = Access.WRITE_ONLY)
        private String writeOnly;
    }
    
    测试JSON

    {
      "name": "name",
      "description": "description",
      "attr1":"attr1",
      "ignore": "ignore",
      "jsonIgnore": "jsonIgnore",
      "jsonIgnoreGetter": "jsonIgnoreGetter",
      "jsonIgnoreSetter": "jsonIgnoreSetter",
      "jsonIgnoreProperties": "jsonIgnoreProperties",
      "jsonIgnorePropertiesSetter": "jsonIgnorePropertiesSetter",
      "jsonIgnorePropertiesGetter": "jsonIgnorePropertiesGetter",
      "readOnly": "readOnly",
      "writeOnly": "writeOnly"
    }
    
    反序列化的结果:如果该值为null,则该值不会被反序列化