Не удалось заполнить объект из JSON с помощью RestTemplate

Я работаю с websecrpits и хочу создать объект из своего JSON. Я использую RestTemplate для этого:

MetaData entity = restTemplate.postForObject(url + "?alf_ticket={ticket}", requestEntity, MetaData.class, _ticket);

но проблема в том, что я получил эту ошибку:

 Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: No suitable constructor found for type [simple type, class custom.alfresco.logic.connect.models.MetaData$Item]: can not instantiate from JSON object (need to add/enable type information?)
     at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@756de23f; line: 7, column: 5] (through reference chain: custom.alfresco.logic.connect.models.MetaData["data"]->custom.alfresco.logic.connect.models.Data["items"]); nested exception is org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class custom.alfresco.logic.connect.models.MetaData$Item]: can not instantiate from JSON object (need to add/enable type information?)
     at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@756de23f; line: 7, column: 5] (through reference chain: custom.alfresco.logic.connect.models.MetaData["data"]->custom.alfresco.logic.connect.models.Data["items"])
        at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readJavaType(MappingJacksonHttpMessageConverter.java:187)
        at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.read(MappingJacksonHttpMessageConverter.java:179)
        at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:549)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:502)
        at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:330)
        at com.custom.alfresco.templates.postTemplate.postObjectResponse(postTemplate.java:112)
        at custom.alfresco.logic.connect.RepositoryOperation.getMetadata(RepositoryOperation.java:617)
        at custom.alfresco.UI.main.main(main.java:35)

Мой класс MetaData выглядит следующим образом:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({ "data" })
public class MetaData extends CommunicationObject {

  @JsonProperty("data")
  private Data data;

  @JsonIgnore
  private Map<String, Object> additionalProperties = new HashMap<String, Object>();

  @JsonProperty("data")
  public Data getData() {
    return data;
  }

  @JsonProperty("data")
  public void setData(Data data) {
    this.data = data;
  }

  @JsonAnyGetter
  public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
  }

  @JsonAnySetter
  public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
  }

  @JsonInclude(JsonInclude.Include.NON_NULL)
  @JsonPropertyOrder({ "items" })
  public class Data {

    @JsonProperty("items")
    private List<Item> items = new ArrayList<Item>();

    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("items")
    public List<Item> getItems() {
      return items;
    }

    @JsonProperty("items")
    public void setItems(List<Item> items) {
      this.items = items;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
      return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
      this.additionalProperties.put(name, value);
    }

  }

  @JsonInclude(JsonInclude.Include.NON_NULL)
  @JsonPropertyOrder({ "type", "parentType", "isContainer", "name", "title", "description", "modified", "modifier",
      "displayPath", "nodeRef" })
  public class Item {

    @JsonProperty("type")
    private String type;

    @JsonProperty("parentType")
    private String parentType;

    @JsonProperty("isContainer")
    private Boolean isContainer;

    @JsonProperty("name")
    private String name;

    @JsonProperty("title")
    private String title;

    @JsonProperty("description")
    private String description;

    @JsonProperty("modified")
    private String modified;

    @JsonProperty("modifier")
    private String modifier;

    @JsonProperty("displayPath")
    private String displayPath;

    @JsonProperty("nodeRef")
    private String nodeRef;

    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("type")
    public String getType() {
      return type;
    }

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

    @JsonProperty("parentType")
    public String getParentType() {
      return parentType;
    }

    @JsonProperty("parentType")
    public void setParentType(String parentType) {
      this.parentType = parentType;
    }

    @JsonProperty("isContainer")
    public Boolean getIsContainer() {
      return isContainer;
    }

    @JsonProperty("isContainer")
    public void setIsContainer(Boolean isContainer) {
      this.isContainer = isContainer;
    }

    @JsonProperty("name")
    public String getName() {
      return name;
    }

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

    @JsonProperty("title")
    public String getTitle() {
      return title;
    }

    @JsonProperty("title")
    public void setTitle(String title) {
      this.title = title;
    }

    @JsonProperty("description")
    public String getDescription() {
      return description;
    }

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

    @JsonProperty("modified")
    public String getModified() {
      return modified;
    }

    @JsonProperty("modified")
    public void setModified(String modified) {
      this.modified = modified;
    }

    @JsonProperty("modifier")
    public String getModifier() {
      return modifier;
    }

    @JsonProperty("modifier")
    public void setModifier(String modifier) {
      this.modifier = modifier;
    }

    @JsonProperty("displayPath")
    public String getDisplayPath() {
      return displayPath;
    }

    @JsonProperty("displayPath")
    public void setDisplayPath(String displayPath) {
      this.displayPath = displayPath;
    }

    @JsonProperty("nodeRef")
    public String getNodeRef() {
      return nodeRef;
    }

    @JsonProperty("nodeRef")
    public void setNodeRef(String nodeRef) {
      this.nodeRef = nodeRef;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
      return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
      this.additionalProperties.put(name, value);
    }

  }

}

И JSON, который я пытаюсь проанализировать, выглядит следующим образом:

{"data":
{
    "items":
    [
        {
            "type": "cm:content",
            "parentType": "cm:cmobject",
            "isContainer": false,
            "name": "second.alf",
            "title": "",
            "description": "",
            "modified": "2014-07-01T16:21:10.712+02:00",
            "modifier": "admin",

            "displayPath": "\/Espace racine\/Alfredine\/Custom saved documents",
            "nodeRef": "workspace://SpacesStore/6f8ebd09-f7bf-4967-9fc5-a90a9d825088"
        }
    ]
}
}

Что не так с моим классом? он говорит, что нет подходящего конструктора для типа Item. Я попытался добавить конструктор класса Item, но все равно получаю ту же ошибку. Любой, кто поможет?


person deltascience    schedule 09.07.2014    source источник


Ответы (2)


Нашел !!. Решение довольно странное на самом деле. Проблема исходит от внутренних классов. Старая структура была такой:

public class MetaData{
  ...
  public class Data {

     ....

     public class Item{
       ...
     }
   }
}

Внутренние классы должны быть статическими, потому что Jackson невозможно напрямую создать экземпляр внутреннего класса. Подробнее см. ЗДЕСЬ. Итак, что я сделал:

public class MetaData{
  ...
  static class Data {

     ....

     static class Item{
       ...
     }
   }
}

Все работало просто отлично. Надеюсь, это помогло!

person deltascience    schedule 09.07.2014

спасибо всем, я нашел ответ в этом квесте. RestTemplate

Found It !!. The solution is quite strange actually. The problem comes from the inner classes. The old structure was like this :


public class MetaData{
  ...
  public class Data {

     ....

     public class Item{
       ...
     }
   }
}
The inner classes has to be static because there is no way Jackson can instantiate directly an inner class. For more details go HERE. So what I did is:

public class MetaData{
  ...
  static class Data {

     ....

     static class Item{
       ...
     }
   }
}
Everything worked just fine. Hope that helped !

shareedit
answered Jul 9 '14 at 10:04

deltascience
1,12312048
add a comment
ok
person user8416478    schedule 29.06.2018