【问题标题】:Conflicting property name definitions in jersey ,using Jackson 2.9.6使用 Jackson 2.9.6 在球衣中冲突的属性名称定义
【发布时间】:2019-01-13 10:14:23
【问题描述】:

我有一个具有以下模式的 REST 服务:

/**
 * Agent
 */

public class Agent {
  @JsonProperty("name")
  private String name = null;

  @JsonProperty("type")
  private String type = null;

  @JsonProperty("description")
  private String description = null;

  @JsonProperty("status")
  private String status = null;

  @JsonProperty("meta")
  private Object meta = null;

  @JsonProperty("Operations")
  private List<OperationsListInner> operations = null;

  @JsonProperty("Properties")
  private List<Object> properties = null;



  public Agent name(String name) {
    this.name = name;
    return this;
  }

  /**
   * Get name
   * @return name
   **/
  @JsonProperty("name")

  @ApiModelProperty(required = true, value = "")
  @NotNull
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Agent type(String type) {
    this.type = type;
    return this;
  }

  /**
   * Get type
   * @return type
   **/
  @JsonProperty("type")
  @ApiModelProperty(value = "")
  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public Agent description(String description) {
    this.description = description;
    return this;
  }

  /**
   * Get description
   * @return description
   **/
  @JsonProperty("description")
  @ApiModelProperty(value = "")
  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public Agent status(String status) {
    this.status = status;
    return this;
  }

  /**
   * Get status
   * @return status
   **/
  @JsonProperty("status")
  @ApiModelProperty(value = "")
  public String getStatus() {
    return status;
  }

  public void setStatus(String status) {
    this.status = status;
  }

  public Agent meta(Object meta) {
    this.meta = meta;
    return this;
  }

  /**
   * Get meta
   * @return meta
   **/
  @JsonProperty("meta")
  @ApiModelProperty(value = "")
  public Object getMeta() {
    return meta;
  }

  public void setMeta(Object meta) {
    this.meta = meta;
  }

  public Agent operations(List<OperationsListInner> operations) {
    this.operations = operations;
    return this;
  }

  public Agent addOperationsItem(OperationsListInner operationsItem) {
    if (this.operations == null) {
      this.operations = new ArrayList<>();
    }
    this.operations.add(operationsItem);
    return this;
  }

  /**
   * Get operations
   * @return operations
   **/
  @JsonProperty("fetchOperations")
  @ApiModelProperty(value = "")
  public List<OperationsListInner> getOperations() {
    return operations;
  }

  public void setOperations(List<OperationsListInner> operations) {
    this.operations = operations;
  }

  public Agent properties(List<Object> properties) {
    this.properties = properties;
    return this;
  }

  public Agent addPropertiesItem(Object propertiesItem) {
    if (this.properties == null) {
      this.properties = new ArrayList<>();
    }
    this.properties.add(propertiesItem);
    return this;
  }

  /**
   * Get properties
   * @return properties
   **/
  @JsonProperty("Properties")
  @ApiModelProperty(value = "")
  public List<Object> getProperties() {
    return properties;
  }

  public void setProperties(List<Object> properties) {
    this.properties = properties;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Agent agent = (Agent) o;
    return Objects.equals(this.name, agent.name) &&
        Objects.equals(this.type, agent.type) &&
        Objects.equals(this.description, agent.description) &&
        Objects.equals(this.status, agent.status) &&
        Objects.equals(this.meta, agent.meta) &&
        Objects.equals(this.operations, agent.operations) &&
        Objects.equals(this.properties, agent.properties);
  }

  @Override
  public int hashCode() {
    return Objects.hash(name, type, description, status, meta, operations, properties);
  }


  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class Agent {\n");

    sb.append("    name: ").append(toIndentedString(name)).append("\n");
    sb.append("    type: ").append(toIndentedString(type)).append("\n");
    sb.append("    description: ").append(toIndentedString(description)).append("\n");
    sb.append("    status: ").append(toIndentedString(status)).append("\n");
    sb.append("    meta: ").append(toIndentedString(meta)).append("\n");
    sb.append("    operations: ").append(toIndentedString(operations)).append("\n");
    sb.append("    properties: ").append(toIndentedString(properties)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }
}

现在,当我尝试将此模式放入我的 REST 客户端时,我遇到了一个冲突的属性名称错误。这发生在我的 GET http 请求中。

Exception in thread "main" java.lang.IllegalStateException: Conflicting/ambiguous property name definitions (implicit name 'operations'): found multiple explicit names: [Operations, fetchOperations], but also implicit accessor: [method com.agentsDB.api.model.individualAgents.Agent#setOperations(1 params)][visible=true,ignore=false,explicitName=false]
    at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder._explode(POJOPropertyBuilder.java:1062)
    at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.explode(POJOPropertyBuilder.java:1043)
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._renameProperties(POJOPropertiesCollector.java:798)
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:324)
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:287)
    at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:170)
    at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164)
    at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239)
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:346)
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:330)
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:255)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:214)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:137)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:411)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477)
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4178)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3997)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992)
    at com.agentsDB.api.JsonUtil.convertJSONtoJAVA(JsonUtil.java:34)
    at com.agentsDB.api.apiClientInvoke.invokeAPI(apiClientInvoke.java:54)
    at com.agentsDB.api.main.main(main.java:25)

我已经阅读了很多这方面的帖子,但找不到任何解决方案。我使用的是 JACKSOn 2.9.6,我的 JsonUtil 如下,我用于序列化和反序列化。

public class JsonUtil {

private static ObjectMapper mapper;
static {
    mapper = new ObjectMapper();
}

public  String convertJAVAtoJSON(Object object){
    String JSONresult = "";
    try{
        JSONresult = mapper.writeValueAsString(object);
    } catch (JsonProcessingException e){
        System.out.println("exception occured");
        e.printStackTrace();
    }
    return JSONresult;

}


public  <T> T convertJSONtoJAVA(String jsonString, Class<T> returnTypeClass){
    T javaResult = null;
    try {
      javaResult = mapper.readValue(jsonString,returnTypeClass);

    }catch(IOException e){
       e.printStackTrace();
    }

   return javaResult;
}

谁能帮我解决?我正在使用球衣+杰克逊。

【问题讨论】:

    标签: java jackson jersey jackson2


    【解决方案1】:

    您应该将@JsonProperty("fetchOperations") 更改为@JsonProperty("Operations")

    【讨论】:

    • 我试过了。它仍然给我错误。即使是属性“名称”!
    【解决方案2】:

    嗯,我找到了这个答案的解决方案。最后!!首先,我必须从我的所有方法(getter 和 setter)中删除所有 @JsonProperty。现在只有我班级中的字段由@JsonProperty 注释。 然后在Objectmapper对象中,不得不添加configure这一行。

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 2015-07-19
      • 2015-07-01
      • 2015-08-07
      • 2014-09-16
      • 1970-01-01
      • 2021-10-04
      相关资源
      最近更新 更多