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相关推荐

  1. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明:本 ...

  2. Spring RestTemplate示例

    Spring RestTemplate示例 Spring RestTemplate提供了一种测试RESTful Web服务的便捷方式. 目录[ 隐藏 ] 1 Spring RestTemplate 1 ...

  3. Spring RestTemplate中文乱码解决方案

    Spring RestTemplate中文乱码解决方案 参考文章: (1)Spring RestTemplate中文乱码解决方案 (2)https://www.cnblogs.com/accesski ...

  4. python自学网课推荐-这些AI课网课最具人气!不仅免费、系统,还附带链接 | 资源...

    原标题:这些AI课网课最具人气!不仅免费.系统,还附带链接 | 资源 铜灵 发自 凹非寺 各类网课千千万,谁家课程可称王? 最近,科技新闻网站HackerNews的网友就公平票选了一波,大家集思广益, ...

  5. java 获取400的错误信息_获取400错误的请求Spring RestTemplate POST

    我想使用POST方法使用Spring Rest web服务.我无法在客户端(网站)访问POJO文件,因此必须在客户端使用JSON并在Web服务中使用POJO.下面是我的代码:获取400错误的请求Spr ...

  6. 使用Spring RestTemplate和Super类型令牌消费Spring-hateoas Rest服务

    Spring-hateoas为应用程序创建遵循HATEOAS原理的基于REST的服务提供了一种极好的方法. 我的目的不是要展示如何创建服务本身,而是要展示如何将客户端写入服务. 我将要使用的示例服务是 ...

  7. spring RestTemplate用法详解

    spring RestTemplate用法详解 spring 3.2.3 框架参考有说明 21.9 Accessing RESTful services on the Client 转载于:https ...

  8. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务

    在Eureka Server 集群基础上,使用Spring RestTemplate,结合Ribbon功能进行服务调用,使用方式非常简单. 1.在主项目中新建一个模块,eurekaclient,mav ...

  9. Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header

    Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header { "Author": & ...

最新文章

  1. 强人工智能基本问题:全局控制与自组织
  2. 软件研发之道——有关软件的思考
  3. catia 桥接曲面圆角_4.3.7.1-Catia曲面之多桥接曲面_简单构面
  4. 【Flask】ORM一对一关联关系
  5. saiku、mondrian前奏之——立方体、维度、Schema的基本概念
  6. cython linux so,更改Cython的.so文件命名规则
  7. jMeter Transaction Controller 学习笔记
  8. python怎么加图片_怎么在图片旁边加文字 python如何在图片上添加文字 - 励志 - 52资讯网...
  9. 新型数据中心需要什么样的存储
  10. 捕捉ctrl+c信号,并进行操作(C++实现)
  11. HTTP/1 已死!
  12. mac上设置新版chrome浏览器跨域
  13. 格式化Mac硬盘---DoYourData Super Eraser安全、快速
  14. 可分离变量的微分方程
  15. 聊聊我在职场的至暗时刻!
  16. cpe(通用平台枚举)命名规范及python CPE库实战
  17. 中国剩余定理的算法实现(基于c语言miracl库)
  18. bootstrap 表单提交验证
  19. AndroidUtilCode 介绍和使用
  20. 2021美赛D题思路

热门文章

  1. 2015蓝桥杯省赛---java---B---7(牌型种数)
  2. java 取随机正整数_Java获取随机数
  3. c mysql 编码_mysql编码转换 mysql编码设置详解
  4. java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...
  5. springmvc新建拦截器
  6. 利用树的先序和后序遍历打印os中的目录树
  7. 设计模式(一):工厂方法
  8. 多线程的三种实现方法
  9. java内核_测量时间:从Java到内核再到
  10. solid设计原则_SOLID设计原则