日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

具有链接资源的Spring RestTemplate

發布時間:2023/12/3 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 具有链接资源的Spring RestTemplate 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring Data REST是一個了不起的項目,它提供了一些機制來將基于Spring Data的存儲庫中的資源公開為REST資源。

使用鏈接資源公開服務

考慮兩個簡單的基于JPA的實體,課程和教師:

@Entity @Table(name = "teachers") public class Teacher {@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id")private Long id;@Size(min = 2, max = 50)@Column(name = "name")private String name;@Column(name = "department")@Size(min = 2, max = 50)private String department; ... }@Entity @Table(name = "courses") public class Course {@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id")private Long id;@Size(min = 1, max = 10)@Column(name = "coursecode")private String courseCode;@Size(min = 1, max = 50)@Column(name = "coursename")private String courseName;@ManyToOne@JoinColumn(name = "teacher_id")private Teacher teacher;.... }

本質上,該關系如下所示:

現在,將這些實體作為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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。