我正在尝试通过RestTemplate类使用基于HAL的REST服务。 响应主体如下所示:

{
  "_embedded": {
    "school:teachers": [
      {
        "name": "Adams",
        "state": "CA",
        "_links": {
          "self": {
            "href": "http://localhost:8080/api/teachers/1"
          }
        }
      },
      {
        "name": "Barnes",
        "state": "FL",
        "_links": {
          "self": {
            "href": "http://localhost:8080/api/teachers/2"
          }
        }
      },
      {
        "name": "Armstrong",
        "state": "GA",
        "_links": {
          "self": {
            "href": "http://localhost:8080/api/teachers/3"
          }
        }
      }
    ]
  },
  "_links": {
    "curies": [
      {
        "href": "http://localhost:8080/docs/html5/{rel}.html",
        "name": "school",
        "templated": true
      }
    ]
  }
}

Teacher班级看起来像这样:

public class Teacher {
    private String name;
    private String state;

    // getters and setters...
}

REST方法的REST服务的返回类型为ResponseEntity<Resources<Resource<Component>>> 因此,我在客户端代码中的请求如下所示:

...
RestTemplate restTemplate = new RestTemplate();

Map<String, Object> dummy = new HashMap<>();
HttpEntity<String> httpEntity = getHttpEntity(); 

ResponseEntity<Resources<Resource<Teacher>>> response = restTemplate.exchange(url,
                HttpMethod.GET,
                httpEntity,
                new ParameterizedTypeReference<Resources<Resource<Teacher>>>() {});

Resources<Resource<Teacher>> resources = response.getBody();
...

当我使用响应类型ParameterizedTypeReference发出请求时,响应的内容为空。 当我使用String我会检索内容列表。

我应该如何使用响应类型ParameterizedTypeReference检索请求以将其直接映射到POJO中?

#1楼 票数:2

我对Vishnoo Rath尝试了类似的方法。 我正计划建立一种通用方法来对所有资源进行此操作。

ResponseEntity<String> response = 
                restTemplate.exchange("http://localhost:8081/rest/cars", HttpMethod.GET, null, String.class);

        String data = response.getBody();
        //log.info(data);

        ObjectMapper om = new ObjectMapper();
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        JsonNode jsNode = om.readTree(data);
        String test = jsNode.at("/_embedded/cars").toString();
        //log.info(test);

        ArrayList<Car> cars = om.readValue(test, new TypeReference<List<Car>>() {
        });

        for (Car theCar : cars) {
            log.info(">>> " + theCar.getMake() + " " + theCar.getModel() + " " + theCar.getYear());
        }

#2楼 票数:1

绝对,您应该和Traverson一起去

Traverson client = new Traverson(new URI("http://localhost:8080/api/"), 
         MediaTypes.HAL_JSON);
    Resources<Resource<Teacher>> teachers = client
        .follow("school:teachers")
        .toObject(new ResourcesType<Resource<Teacher>>(){});

https://docs.spring.io/spring-hateoas/docs/current/reference/html/#client.traverson

#3楼 票数:0

我也面临类似的问题。 我选择的解决方法是:

        ResponseEntity<String> response = restTemplate.exchange(
                "http://localhost:8080/payment/search/findByApprovalDate?approvalDate=2017-11-06", HttpMethod.GET,
                null, String.class);

        String data = response.getBody();

        ObjectMapper om = new ObjectMapper();
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        JsonNode jsNode = om.readTree(data);
        String test = jsNode.at("/_embedded/payment").toString();

        payments = om.readValue(test, new TypeReference<List<RHPayment>>() {
        });

#4楼 票数:0

我使用Bowman在JAVA中使用JSON + HAL资源。 这个库大大简化了比较RestTemplate资源的消耗,如图这篇文章

  ask by Oni1 translate from so

未解决问题?本站智能推荐:

1回复

具有下载文件端点的基于HAL的REST API

我正在使用Spring Boot开发基于HAL的REST API。 我在控制器中需要一个端点,该端点将文件发送到客户端。 有一些关于SO的示例,但是由于以下异常而无法使用: 我的Spring应用程序: 我的Controller类如下所示: 我正在添加应用程序代码中所示
1回复

是PersonResource与Spring-hateoas中的Person一样的东西

我有一个包含id,firstName,lastName的Person.java类: 根据文档,如果我希望获得仇恨链接,分页和计数,则应使用PersonResource : https://docs.spring.io/spring-hateoas/docs/current/refer
1回复

春季REST HATEOAS

我正在尝试遵循最佳实践,想象一个带有/ books端点的基本API。 我有以下类:Book BookRepository(PagingAndSortingRepository,但未导出!)BookController(这是服务类)BookResource(“状态状态转移”中该书的“表示”)
1回复

如何在当前的Rest API中实现spring hateoas?

我已经按照标准成功实现了RestFul API,但没有将所有功能都整合到我的API中。 例如,我的API目前遵守URI标准以及根据所解释标准的正确动词用法。 我想要实现的是根据本文实现的第3级实现的API http://zeroturnaround.com/rebellabs/be
1回复

由于HAL + JSON媒体类型不清晰,无法使用Spring HATEOAS执行HAL + JSON Level 3 RESTful API

Level 3 RESTful API的功能包括自定义媒体类型,例如application/vnd.service.entity.v1+json 。 在我的情况下,我使用HAL来提供我的JSON中相关资源之间的链接。 我不清楚使用HAL + JSON的自定义媒体类型的正确格式。 我目前
1回复

Spring 中是否有简单的 HATEOAS + Pagination 实现而无需数据休息?

我已经搜索了几天关于如何实现包含 HATEOAS 链接 + 分页与 Spring Boot 和 JPA(无 spring 数据休息)的 Spring REST API 就像这个随机示例: 但是,到目前为止我发现的解决方案非常复杂,或者样板的数量很可笑这个解决方案例如: https : //how
1回复

Spring Boot Data REST,HATEOAS不使用自定义Controller

我在Spring引导数据休息中使用MongoRepository,它工作得很好而没有实现我自己的控制器。 但我想在我新创建的对象中加入“注册日期”,默认实现不支持。 我需要实现自己的自定义控制器,以在每个新对象中添加额外的字段。 问题是当我实现自己的控制器时,HATEOAS停止工作。
7回复

解析自定义控制器中的实体 URI (Spring HATEOAS)

我有一个基于 spring-data-rest 的项目,它还有一些自定义端点。 为了发送 POST 数据,我正在使用 json 之类的 这对于 spring-data-rest 很好,但不适用于自定义控制器。 例如: 当我打电话 我有答案 原因是 spring 无法将 URI 转