Java 使用spring hateoas使用基于HAL的REST服务

Java 使用spring hateoas使用基于HAL的REST服务,java,spring,rest,spring-hateoas,Java,Spring,Rest,Spring Hateoas,我正在尝试使用RestTemplate类使用基于HAL的REST服务。 响应主体如下所示: { "_embedded": { "school:teachers": [ { "name": "Adams", "state": "CA", "_links": { "self": { "href": "http://localhost:8080/api/teachers/1"

我正在尝试使用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
      }
    ]
  }
}
public class Teacher {
    private String name;
    private String state;

    // getters and setters...
}
...
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();
...
教师
课程如下所示:

{
  "_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
      }
    ]
  }
}
public class Teacher {
    private String name;
    private String state;

    // getters and setters...
}
...
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();
...
GET方法的REST服务的返回类型为
ResponseEntity
。因此,我在客户端代码中的请求如下所示:

{
  "_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
      }
    ]
  }
}
public class Teacher {
    private String name;
    private String state;

    // getters and setters...
}
...
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();
...
。。。
RestTemplate RestTemplate=新RestTemplate();
Map dummy=newhashmap();
HttpEntity HttpEntity=getHttpEntity();
ResponseEntity response=restemplate.exchange(url,
HttpMethod.GET,
httpEntity,
新的ParameteredTypeReference(){});
Resources=response.getBody();
...
当我使用响应类型
ParameterizedTypeReference
发出请求时,响应的内容为空。当我使用
String
时,我检索内容列表


我应该如何使用响应类型
ParameterizedTypeReference
来请求检索它以直接在POJO中映射它?

当然,您应该使用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>>(){});
Traverson客户端=新的Traverson(新的URI(“http://localhost:8080/api/"), 
MediaTypes.HAL_JSON);
资源教师=客户
.follow(“学校:教师”)
.toObject(新的ResourcesType(){});

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

        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>>() {
        });
ResponseEntity response=restemplate.exchange(
"http://localhost:8080/payment/search/findByApprovalDate?approvalDate=2017-11-06“,HttpMethod.GET,
null,String.class);
字符串数据=response.getBody();
ObjectMapper om=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
JsonNode jsNode=om.readTree(数据);
String test=jsNode.at(“/_embedded/payment”).toString();
payments=om.readValue(测试,新类型引用(){
});

我使用JAVA使用JSON+HAL资源。与中所示的RestTemplate相比,该库大大简化了资源消耗。

我尝试了与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());
        }
ResponseEntity响应=
restTemplate.exchange(“http://localhost:8081/rest/cars,HttpMethod.GET,null,String.class);
字符串数据=response.getBody();
//日志信息(数据);
ObjectMapper om=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
JsonNode jsNode=om.readTree(数据);
String test=jsNode.at(“/_embedded/cars”).toString();
//日志信息(测试);
ArrayList cars=om.readValue(测试,新类型引用(){
});
汽车(汽车:汽车){
log.info(“>>>>”+theCar.getMake()+“”+theCar.getModel()+“”+theCar.getYear());
}

您的服务返回
资源
似乎非常可疑。如果你控制代码,考虑改变它。也就是说,您必须在客户端使用
restemplate
?如果不是,则是更好的选择,因为它是为导航HAL响应而构建的,而
RestTemplate
不是。@AbhijitSarkar我不控制服务器端代码,因此我必须使用它。我从未听说过Traverson,我必须看看如何发出请求。@AbhijitSarkar
资源有什么问题?@AbhijitSarkar必须问同样的问题-该响应类型有什么问题?这既合法又普遍。特别是你为什么认为这很重要。当然,问题在于使用JSON?因此,服务器上的响应“type”不重要。请在回答中添加相关代码和说明,而不是链接到外部URL。