使用RestTemplate从JSON填充对象失败

时间:2014-07-09 09:37:26

标签: java json parsing rest 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类的构造函数,但我仍然得到相同的错误。有人帮忙吗?

2 个答案:

答案 0 :(得分:0)

发现它!!实际上解决方案很奇怪。问题来自内部阶级。旧结构是这样的:

public class MetaData{
  ...
  public class Data {

     ....

     public class Item{
       ...
     }
   }
}

内部类必须是静态的,因为Jackson无法直接实例化内部类。有关详细信息,请转到HERE。所以我做的是:

public class MetaData{
  ...
  static class Data {

     ....

     static class Item{
       ...
     }
   }
}

一切都很好。希望有所帮助!

答案 1 :(得分:0)

谢谢大家,我已经在此问题中找到答案。Fail filling object from JSON with 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