当前位置: 首页 > 知识库问答 >
问题:

将响应映射到DTO时,Spring中存在异常

黄意智
2023-03-14

我收到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 + '\'' +
                    '}';
        }
    }


}

当我尝试将FinalTestDt中的响应映射到类时,它会引发一个异常:

WARN:org.springframework.http.converter.json.MappingJackson2HttpMessageConzer-无法评估类型[简单类型,类FinalTestDTO]的反序列化:com.fasterxml.jackson.databind.JsonMappingExc农田:无法识别类型:[null]和

例外情况:

组织。springframework。网状物客户RestClientException:无法提取响应:在org上找不到响应类型[class com.bullhorn.DTO.FinalTestDTO]和内容类型[application/json;charset=UTF-8]的合适HttpMessageConverter。springframework。网状物客户HttpMessageConverterExtractor。extractData(HttpMessageConverterExtractor.java:110)位于org。springframework。网状物客户RestTemplate$ResponseEntityResponseExtractor。extractData(RestTemplate.java:809)位于org。springframework。网状物客户RestTemplate$ResponseEntityResponseExtractor。extractData(RestTemplate.java

...

共有1个答案

江丰羽
2023-03-14

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

 类似资料:
  • 我已经用MapStruct 1.1工作了几天,但还没有达到我所需要的。 我想做的是:我想将JPA实体映射到DTO,以便在Primefaces项目中实现更好的属性视图绑定。 所以我有我的实体如下: 病人JAVA 人JAVA 我想把这些实体画成这样: 耐心等待。JAVA 潘松多。JAVA 我编写了Mapper类和一个实用程序,就像GitHub上的官方示例中描述的那样(https://github.co

  • 我正在尝试使用AutoMapper在LLBLGen实体和DTO之间创建映射。 我的DTO如下所示: ParentEntity包含一个与DTO列表同名的ChildCollection和一个Id(需要忽略其他LLBL字段)。因此,当ParentEntity映射到父d to时,它也应该将ChildCollection映射到一个子列表。 这就是我到目前为止得到的: 这会导致Id被映射,但List的计数为0

  • 我开始使用JOOQ和dvd租赁商店数据库aka sakila。基本上,我想找一个演员和他的角色(我创建的表)。到目前为止,我想到了这个: 我希望能够将演员及其角色提取到一个对象中:DTO。我找到了这篇文章https://arnaudroger.github.io/blog/2017/03/02/jooq-one-to-many-without-dto.html但我发现使用sfm的解决方案过于冗长,

  • 我的域名: 我的DTO: 我的地图绘制程序如下所示: 但是,我得到了以下错误: 目标名称“Framework.system”的类型Framework中的未知属性“system”。你是说“框架外部化”吗?目标名称为“Framework.availability”的Framework类型中的未知属性“availability”。你是说“框架外部化”吗?

  • 我有一个带有域类的Grails项目。这个持久类应该映射到JavaDTO。我在这里发现了一个非常旧的Grails插件,它并没有真正解决这个问题。 是否有一个插件或方法: 注释映射到相应DTO类的域类属性

  • 在我的服务中,我试图将实体映射到,但是由于方法返回(),我不能像通常用于那样进行如下转换。它为方法抛出“不能在'iterable'中解析方法'stream'”错误。 那么,如何将这个实体映射到?