【问题标题】:RestClientException in spring when mapping response to DTO将响应映射到 DTO 时 Spring 中的 RestClientException
【发布时间】:2017-05-06 19:58:35
【问题描述】:

我收到了 http 请求的响应,格式如下:

    {  
  "total": 1,
  "start": 0,
  "count": 1,
  "data": [
    {
      "id": 123,
      "cg": {
        "total": 1,
        "data": [
          {
            "id": 1,
            "name": "xyz"
          }
        ]
      },
      "_score": 1
    }
  ]
}

我想在执行以下代码时将其映射到 DTO:

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<FinalTestDTO> responseEntity = restTemplate.getForEntity(uri, FinalTestDTO.class);

DTO 类:

public class FinalTestDTO implements Serializable{

    private static final long serialVersionUID = 250452811965441459L;

    private int total;

    private int start;

    private int count;

    @JsonProperty("data")
    private List<TestDTO> data;

    public FinalTestDTO() {
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public List<TestDTO> getData() {
        return data;
    }

    public void setData(List<TestDTO> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "FinalJobDTO [total=" + total + ", start=" + start + ", count=" + count + ", data=" + data + "]";
    }

}

另一个类是:

@JsonIgnoreProperties(ignoreUnknown = true)
public class TestDTO implements Serializable {

    private static final long serialVersionUID = -1738546890129236134L;

    private long id;

    private TestCg cg;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public TestCg getCg() {
        return cg;
    }

    public void setCg(TestCg cg) {
        this.cg = cg;
    }

    @Override
    public String toString() {
        return "TestDTO{" +
                "id=" + id +
                ", cg=" + cg +
                '}';
    }

    public class TestCg {

        private int total;

        @JsonProperty( "data" )
        private List<Cg> data;

        public TestCg() {
            super();
        }

        @JsonCreator
        public TestCg(@JsonProperty("total")int total) {
            this.total = total;
        }

        @JsonCreator
        public TestCg(@JsonProperty("data") List<Cg> data) {
            this.data = data;
        }

        @JsonCreator
        public TestCg(@JsonProperty("total")int total, @JsonProperty("data")List<Cg> data) {
            this.total = total;
            this.data = data;
        }

        public int getTotal() {
            return total;
        }

        public void setTotal(int total) {
            this.total = total;
        }

        public List<Cg> getData() {
            return data;
        }

        public void setData(List<Cg> data) {
            this.data = data;
        }

        @Override
        public String toString() {
            return "TestCg{" +
                    "total=" + total +
                    ", data=" + data +
                    '}';
        }
    }

    public class Cg implements Serializable {

        private static final long serialVersionUID = 4187229577080155505L;

        @JsonProperty( "id" )
        private int id;

        @JsonProperty( "name" )
        private String name;

        public Cg() {
            super();
        }

        @JsonCreator
        public Cg(@JsonProperty( "id" )int id) {
            this.id = id;
        }

        @JsonCreator
        public Cg(@JsonProperty( "name" )String name) {
            this.name = name;
        }

        @JsonCreator
        public Cg(@JsonProperty( "id" )int id, @JsonProperty( "name" )String name) {
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

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

        @Override
        public String toString() {
            return "Cg{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }


}

当我尝试在 FinalTestDTO 类中映射响应时,它会引发异常:

警告:org.springframework.http.converter.json.MappingJackson2HttpMessageConverter - 无法评估类型 [简单类型,类 FinalTestDTO] 的反序列化:com.fasterxml.jackson.databind.JsonMappingException:无法识别的类型:[null] 和

例外:

org.springframework.web.client.RestClientException:无法提取 响应:没有找到适合响应类型的 HttpMessageConverter [class com.bullhorn.DTO.FinalTestDTO] 和内容类型 [应用程序/json;charset=UTF-8] 在 org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:110) 在 org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:809) 在 org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java

...

【问题讨论】:

  • 我认为问题与你的嵌入式类有关​​,你能做一个快速测试并为每个类创建一个文件吗?
  • 谢谢@cralfaro 它有效..!
  • 太棒了 :) 完美
  • 我添加了响应,以便有类似问题的人可以节省一些时间,您能验证一下吗?

标签: java json spring jackson resttemplate


【解决方案1】:

尝试将所有内部类提取到独立的文件类中。由于某种原因,Jackson 无法找到构造函数或存在一些与之相关的问题,我想知道更多原因,但使用隔离类可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2021-01-08
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多