首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用基于HAL的REST服务和spring-hateoas

使用基于HAL的REST服务和spring-hateoas
EN

Stack Overflow用户
提问于 2017-08-16 09:55:04
回答 4查看 5.3K关注 0票数 2

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

代码语言:javascript
复制
{
  "_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类如下所示:

代码语言:javascript
复制
public class Teacher {
    private String name;
    private String state;

    // getters and setters...
}

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

代码语言:javascript
复制
...
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中?

EN

回答 4

Stack Overflow用户

发布于 2018-06-01 18:38:18

当然,你应该选择Traverson

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2019-08-21 00:52:44

我尝试了一种类似于Vishnoo Rath的方法。我计划为我所有的资源建立一个通用的方法来做这件事。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-07-03 16:39:01

在Java语言中,我使用Bowman来消耗JSON+HAL资源。与this article中所示的RestTemplate相比,该库极大地简化了资源消耗。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45703962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档