Jersey中使用Jackson2.9.6的属性名称定义冲突

vsnjm48y  于 10个月前  发布在  其他
关注(0)|答案(3)|浏览(80)

我有一个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)


我已经读了很多关于这方面的文章,但找不到任何解决方案。我使用Jackson2.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;
}


有谁能帮我解决吗?我用的是Jersey+Jackson

qf9go6mv

qf9go6mv1#

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

evrscar2

evrscar22#

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

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

字符串

ubby3x7f

ubby3x7f3#

也有类似的问题。您在@JsonProperty中使用不同的值注解类字段及其getter,这导致了冲突。

相关问题