【问题标题】:Fail filling object from JSON with RestTemplate使用 RestTemplate 从 JSON 填充对象失败
【发布时间】:2014-07-09 09:37:26
【问题描述】:

我使用 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 类添加一个构造函数,但我仍然得到相同的错误。有人帮忙吗?

【问题讨论】:

    标签: java json parsing rest resttemplate


    【解决方案1】:

    找到了!!解决方案实际上很奇怪。问题来自内部类。旧的结构是这样的:

    public class MetaData{
      ...
      public class Data {
    
         ....
    
         public class Item{
           ...
         }
       }
    }
    

    内部类必须是静态的,因为Jackson 无法直接实例化内部类。欲了解更多详情,请转至HERE。所以我所做的是:

    public class MetaData{
      ...
      static class Data {
    
         ....
    
         static class Item{
           ...
         }
       }
    }
    

    一切正常。希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2016-01-13
      • 2020-07-10
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多