2

I have a REST service with the following modal:

/**
 * 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    ");
  }
}

now when i am trying to get this modal into my REST client, I am getting a conflicting property name error. This is happening in my GET http request.

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)

I already read a lot of post in this regard but couldn't find any solution to this. I an using JACKSOn 2.9.6 and my JsonUtil is as follow which i have used for serialization and deserialization .

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;
}

can anyone help me resolve it? I am using jersey+Jackson.

user10182984
  • 41
  • 1
  • 5

3 Answers3

0

You should change @JsonProperty("fetchOperations") to @JsonProperty("Operations").

Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720
olgunyldz
  • 531
  • 3
  • 8
0

Well I found the solution to this answer. FINALLY!! Firstly, I had to remove all the @JsonProperty from all my methods(getters and setters). Now only the fields in my class are annotated by @JsonProperty. And then in the Objectmapper object, had to add the configure line.

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720
user10182984
  • 41
  • 1
  • 5
0

Had a similar issue. You are annotating a class field and its getter with different values in @JsonProperty and that resulted in a conflict.

  • 2
    It would be great if you could include the parts of the code that you see are wrong in the answer, both since the question may be changed and your answer can get out of sync with it and that it is easier to understand how this answer may help solve the problem. Appreciate that you take the time to answer questions! – melwil Jun 14 '23 at 14:01
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – L_Cleo Jun 17 '23 at 10:50