gpt4 book ai didi

java - 将 JsonCreator 与 JsonProperty.Access.READ_ONLY 结合使用时出现 InvalidDefinitionException

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:31 30 4
gpt4 key购买 nike

尝试将 @JsonCreator@JsonProperty(value = "version", access = JsonProperty.Access.READ_ONLY) 一起使用时遇到 InvalidDefinitionException

这就是我的类(class)的样子:

@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]

我的环境详细信息:我使用的是 Spring Boot 2.0.0.M2 版本和 Jackson 2.9.0.pr3

我的目的是在反序列化期间省略field2

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

最佳答案

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

  1. 使用READ_ONLY

只需向您不想反序列化的属性添加注释

@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,则不反序列化。

    enter image description here

    关于java - 将 JsonCreator 与 JsonProperty.Access.READ_ONLY 结合使用时出现 InvalidDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44854799/

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