javascript
使用Spring RestTemplate和Super类型令牌消费Spring-hateoas Rest服务
Spring-hateoas為應用程序創建遵循HATEOAS原理的基于REST的服務提供了一種極好的方法。
我的目的不是要展示如何創建服務本身,而是要展示如何將客戶端寫入服務。
我將要使用的示例服務是Josh Long( @starbuxman )編寫的“ the-spring-rest-stack ”。 我要使用的特定子項目是這里的陰影。 如果使用“ mvn jetty”命令運行此子項目,則可以在http:// localhost:8080 / users / 2中使用基于REST的端點列出用戶的詳細信息,其中“ 2”是用戶的ID,并給出一個以下結構的結果:
{"links": [{"rel": "self","href": "http://localhost:8080/users/2"}, {"rel": "customers","href": "http://localhost:8080/users/2/customers"}, {"rel": "photo","href": "http://localhost:8080/users/2/photo"}],"id": 2,"firstName": "Lois","profilePhotoMediaType": null,"lastName": "Lane","username": "loislane","password": null,"profilePhotoImported": false,"enabled": true,"signupDate": 1370201631000 }為了獲得該用戶的特定客戶,端點位于http:// localhost:8080 / users / 2 / customers / 17,它提供以下結構的輸出:
{"links": [{"rel": "self","href": "http://localhost:8080/users/2/customers/17"}, {"rel": "user","href": "http://localhost:8080/users/2"}],"id": 17,"signupDate": 1372461079000,"firstName": "Scott","lastName": "Andrews","databaseId": 17 }現在,對于這兩種服務的使用者而言,結果可以由Spring-hateoas項目中的一個稱為Resource的Java類型表示,并且是具有以下簽名的泛型類:
public class Resource<T> extends ResourceSupport {protected Resource() {this.content = null;}public Resource(T content, Link... links) {this(content, Arrays.asList(links));}...因此,以上兩種服務的使用者將獲得以下兩種類型:
Resource<User> user = .... //call to the serviceResource<Customer> customer = ... //call to the service現在的問題是,由于上面的“用戶”和“客戶”是參數化類型,如果我要使用杰克遜作為json處理器綁定這些類型,我將按照以下方式進行操作:
ObjectMapper objectMapper = new ObjectMapper(); Resource<Customer> customer = objectMapper.readValue(customerAsJson, Resource.class); Resource<User> user = objectMapper.readValue(userAsJson, Resource.class);上面的方法不起作用,原因是由于Java類型擦除導致參數化Resource的類型信息丟失,Jackson不知道創建Resource <User>或Resource <Customer>的實例
解決方法是使用超類型令牌 ,這實質上是一種提供像杰克遜庫類型的信息和我以前的博客上講述它在這里 。 這樣,將json映射到適當的參數化類型的工作代碼將如下所示:
ObjectMapper objectMapper = new ObjectMapper(); Resource<Customer> customer = objectMapper.readValue(customerAsJson, new TypeReference<Resource<Customer>>() {}); Resource<User> customer = objectMapper.readValue(userAsJson, new TypeReference<Resource<User>>() {});Spring的基于Rest的服務的客戶端抽象是RestTemplate ,它可以使用稱為HttpMessageConverter的抽象處理各種消息格式(xml,json,atom等),以處理每種消息格式的綁定細節。
Spring RestTemplate提供了自己的Super Type令牌實現,能夠按照Jackson的TypeReference的路線將不同的消息格式綁定到參數化類型,這被稱為ParameterizedTypeReference 。
ParameterizedTypeReference可用于通過以下方式將用戶和客戶的Rest響應完全綁定到Java類型:
RestTemplate restTemplate = new RestTemplate(); ResponseEntity<Resource<User>> responseEntity =restTemplate.exchange("http://localhost:8080/users/2", HttpMethod.GET, null, new ParameterizedTypeReference<Resource<User>>() {}, Collections.emptyMap()); if (responseEntity.getStatusCode() == HttpStatus.OK) {Resource<User> userResource = responseEntity.getBody();User user = userResource.getContent(); }RestTemplate restTemplate = new RestTemplate(); ResponseEntity<Resource<Customer>> responseEntity =restTemplate.exchange("http://localhost:8080/users/2/customers/17", HttpMethod.GET, null, new ParameterizedTypeReference<Resource<Customer>>() {}, Collections.emptyMap()); if (responseEntity.getStatusCode() == HttpStatus.OK) {Resource<Customer> customerResource = responseEntity.getBody();Customer customer = customerResource.getContent(); } 總之,ParameterizedTypeReference提供了一種處理參數化類型的巧妙方法,并且在使用基于Spring Hateoas的REST服務時非常有用。
翻譯自: https://www.javacodegeeks.com/2014/01/consuming-spring-hateoas-rest-service-using-spring-resttemplate-and-super-type-tokens.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的使用Spring RestTemplate和Super类型令牌消费Spring-hateoas Rest服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 尼康推出新一代步进式光刻机“NSR-22
- 下一篇: JSF:直接从页面将参数传递给JSF操作