javascript
具有链接资源的Spring RestTemplate
Spring Data REST是一個了不起的項目,它提供了一些機制來將基于Spring Data的存儲庫中的資源公開為REST資源。
使用鏈接資源公開服務
考慮兩個簡單的基于JPA的實體,課程和教師:
本質上,該關系如下所示:
現在,將這些實體作為REST資源公開所需要做的就是以這種方式在基于JPA的Spring Data存儲庫上添加@RepositoryRestResource批注,首先是“ Teacher”資源:
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import univ.domain.Teacher;@RepositoryRestResource public interface TeacherRepo extends JpaRepository<Teacher, Long> { }并公開課程資源:
@RepositoryRestResource public interface CourseRepo extends JpaRepository<Course, Long> { }完成此操作并假設數據存儲區中已經有幾名教師和幾門課程,關于課程的GET將產生以下類型的響應:
{"_links" : {"self" : {"href" : "http://localhost:8080/api/courses{?page,size,sort}","templated" : true}},"_embedded" : {"courses" : [ {"courseCode" : "Course1","courseName" : "Course Name 1","version" : 0,"_links" : {"self" : {"href" : "http://localhost:8080/api/courses/1"},"teacher" : {"href" : "http://localhost:8080/api/courses/1/teacher"}}}, {"courseCode" : "Course2","courseName" : "Course Name 2","version" : 0,"_links" : {"self" : {"href" : "http://localhost:8080/api/courses/2"},"teacher" : {"href" : "http://localhost:8080/api/courses/2/teacher"}}} ]},"page" : {"size" : 20,"totalElements" : 2,"totalPages" : 1,"number" : 0} }特定的課程如下所示:
{"courseCode" : "Course1","courseName" : "Course Name 1","version" : 0,"_links" : {"self" : {"href" : "http://localhost:8080/api/courses/1"},"teacher" : {"href" : "http://localhost:8080/api/courses/1/teacher"}} }如果您想知道“ _links”,“ _ embedded”是什么– Spring Data REST使用超文本應用程序語言(或簡稱HAL)來表示鏈接,例如說一門課程和一位老師之間的鏈接。
基于HAL的REST服務–使用
有了基于HAL的REST服務,我想到的問題就是如何為該服務編寫客戶端。 我相信有更好的方法可以做到這一點,但是接下來的工作對我來說很有效,我歡迎任何更簡潔的編寫客戶方法。
首先,我修改了RestTemplate來注冊一個定制的Json轉換器,該轉換器可以理解基于HAL的鏈接:
public RestTemplate getRestTemplateWithHalMessageConverter() {RestTemplate restTemplate = new RestTemplate();List<HttpMessageConverter<?>> existingConverters = restTemplate.getMessageConverters();List<HttpMessageConverter<?>> newConverters = new ArrayList<>();newConverters.add(getHalMessageConverter());newConverters.addAll(existingConverters);restTemplate.setMessageConverters(newConverters);return restTemplate; }private HttpMessageConverter getHalMessageConverter() {ObjectMapper objectMapper = new ObjectMapper();objectMapper.registerModule(new Jackson2HalModule());MappingJackson2HttpMessageConverter halConverter = new TypeConstrainedMappingJackson2HttpMessageConverter(ResourceSupport.class);halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON));halConverter.setObjectMapper(objectMapper);return halConverter; }Spring HATEOS項目提供了Jackson2HalModule并了解HAL表示形式。
有了這個閃亮的新RestTemplate,首先讓我們創建一個Teacher實體 :
Teacher teacher1 = new Teacher(); teacher1.setName("Teacher 1"); teacher1.setDepartment("Department 1"); URI teacher1Uri =testRestTemplate.postForLocation("http://localhost:8080/api/teachers", teacher1);請注意,在創建實體時,響應為http狀態碼201,位置標頭指向新創建的資源的uri,Spring RestTemplate提供了一種巧妙的方式來通過API發布和獲取此位置標頭。 因此,現在我們有一個Teacher1Uri代表新創建的老師。
給定此教師URI,現在讓我們檢索教師 ,教師資源的原始json如下所示:
{"name" : "Teacher 1","department" : "Department 1","version" : 0,"_links" : {"self" : {"href" : "http://localhost:8080/api/teachers/1"}} }并使用RestTemplate來檢索它:
ResponseEntity<Resource<Teacher>> teacherResponseEntity= testRestTemplate.exchange("http://localhost:8080/api/teachers/1", HttpMethod.GET, null, new ParameterizedTypeReference<Resource<Teacher>>() { });Resource<Teacher> teacherResource = teacherResponseEntity.getBody();Link teacherLink = teacherResource.getLink("self"); String teacherUri = teacherLink.getHref();Teacher teacher = teacherResource.getContent();Jackson2HalModule可以幫助干凈地解壓縮鏈接并掌握教師實體本身。 我之前已經在這里解釋了ParameterizedTypeReference。
現在,更棘手的部分是創建課程。
創建課程很棘手,因為它與教師有關系,使用HAL表示這種關系并不是那么簡單。 創建課程的原始POST如下所示:
{"courseCode" : "Course1","courseName" : "Course Name 1","version" : 0,"teacher" : "http://localhost:8080/api/teachers/1" }請注意,對教師的引用是一個URI,這就是HAL如何表示專門針對POST內容的嵌入式引用,因此現在可以通過RestTemplate獲得此表單。
首先創建一個課程:
Course course1 = new Course(); course1.setCourseCode("Course1"); course1.setCourseName("Course Name 1");在這一點上,通過處理json樹表示形式并將教師鏈接添加為教師uri,可以更輕松地提供教師鏈接:
ObjectMapper objectMapper = getObjectMapperWithHalModule(); ObjectNode jsonNodeCourse1 = (ObjectNode) objectMapper.valueToTree(course1); jsonNodeCourse1.put("teacher", teacher1Uri.getPath());并發布此內容,應與鏈接的老師一起創建課程:
URI course1Uri = testRestTemplate.postForLocation(coursesUri, jsonNodeCourse1);并檢索此新創建的課程:
ResponseEntity<Resource<Course>> courseResponseEntity= testRestTemplate.exchange(course1Uri, HttpMethod.GET, null, new ParameterizedTypeReference<Resource<Course>>() { });Resource<Course> courseResource = courseResponseEntity.getBody(); Link teacherLinkThroughCourse = courseResource.getLink("teacher");這總結了如何使用RestTemplate創建和檢索鏈接的資源,歡迎提出其他建議。
- 如果您有興趣進一步探索它,可以在github repo上找到整個示例–測試在這里 。
翻譯自: https://www.javacodegeeks.com/2014/12/spring-resttemplate-with-a-linked-resource.html
總結
以上是生活随笔為你收集整理的具有链接资源的Spring RestTemplate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 明年起安装 2 万个壁挂式充电器,希尔顿
- 下一篇: 用户会话,数据控件和AM池