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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

具有链接资源的Spring RestTemplate

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

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

使用鏈接資源公開服務(wù)

考慮兩個簡單的基于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;.... }

本質(zhì)上,該關(guān)系如下所示:

現(xiàn)在,將這些實體作為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> { }

完成此操作并假設(shè)數(shù)據(jù)存儲區(qū)中已經(jīng)有幾名教師和幾門課程,關(guān)于課程的GET將產(chǎn)生以下類型的響應(yīng):

{"_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使用超文本應(yīng)用程序語言(或簡稱HAL)來表示鏈接,例如說一門課程和一位老師之間的鏈接。

基于HAL的REST服務(wù)–使用

有了基于HAL的REST服務(wù),我想到的問題就是如何為該服務(wù)編寫客戶端。 我相信有更好的方法可以做到這一點,但是接下來的工作對我來說很有效,我歡迎任何更簡潔的編寫客戶方法。

首先,我修改了RestTemplate來注冊一個定制的Json轉(zhuǎn)換器,該轉(zhuǎn)換器可以理解基于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,首先讓我們創(chuàng)建一個Teacher實體 :

Teacher teacher1 = new Teacher(); teacher1.setName("Teacher 1"); teacher1.setDepartment("Department 1"); URI teacher1Uri =testRestTemplate.postForLocation("http://localhost:8080/api/teachers", teacher1);

請注意,在創(chuàng)建實體時,響應(yīng)為http狀態(tài)碼201,位置標(biāo)頭指向新創(chuàng)建的資源的uri,Spring RestTemplate提供了一種巧妙的方式來通過API發(fā)布和獲取此位置標(biāo)頭。 因此,現(xiàn)在我們有一個Teacher1Uri代表新創(chuàng)建的老師。

給定此教師URI,現(xiàn)在讓我們檢索教師 ,教師資源的原始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可以幫助干凈地解壓縮鏈接并掌握教師實體本身。 我之前已經(jīng)在這里解釋了ParameterizedTypeReference。

現(xiàn)在,更棘手的部分是創(chuàng)建課程。

創(chuàng)建課程很棘手,因為它與教師有關(guān)系,使用HAL表示這種關(guān)系并不是那么簡單。 創(chuàng)建課程的原始POST如下所示:

{"courseCode" : "Course1","courseName" : "Course Name 1","version" : 0,"teacher" : "http://localhost:8080/api/teachers/1" }

請注意,對教師的引用是一個URI,這就是HAL如何表示專門針對POST內(nèi)容的嵌入式引用,因此現(xiàn)在可以通過RestTemplate獲得此表單。

首先創(chuàng)建一個課程:

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());

并發(fā)布此內(nèi)容,應(yīng)與鏈接的老師一起創(chuàng)建課程:

URI course1Uri = testRestTemplate.postForLocation(coursesUri, jsonNodeCourse1);

并檢索此新創(chuàng)建的課程:

ResponseEntity<Resource<Course>> courseResponseEntity= testRestTemplate.exchange(course1Uri, HttpMethod.GET, null, new ParameterizedTypeReference<Resource<Course>>() { });Resource<Course> courseResource = courseResponseEntity.getBody(); Link teacherLinkThroughCourse = courseResource.getLink("teacher");

這總結(jié)了如何使用RestTemplate創(chuàng)建和檢索鏈接的資源,歡迎提出其他建議。

  • 如果您有興趣進(jìn)一步探索它,可以在github repo上找到整個示例–測試在這里 。

翻譯自: https://www.javacodegeeks.com/2014/12/spring-resttemplate-with-a-linked-resource.html

總結(jié)

以上是生活随笔為你收集整理的具有链接资源的Spring RestTemplate的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。