【Spring实战】21 Spring Data REST 常用功能详细介绍

文章目录

    • 1. 资源导出(Resource Exporting)
    • 2. 查询方法(Query Methods)
    • 3. 分页和排序(Pagination and Sorting)
    • 4. 关联关系(Associations)
    • 5. 事件(Events)
    • 6. 安全性(Security)
    • 结语

在上一篇 【Spring实战】20 Spring Data REST+JPA构建RESTful API 文章中,我们已经知道了如何去使用 Spring Data REST 集成 JPA 去帮我们构建基础的 RESTful API(常用的增删改查)。它的作用远不止于此,本文将继续研究一下 Spring Data REST 还有哪一些常用的功能,并提供详细的代码示例。

1. 资源导出(Resource Exporting)

Spring Data REST 会自动将 Spring Data 存储库中的实体类型暴露为 RESTful 资源。我们无需显式编写控制器或服务层代码,就可以让实体成为可通过 HTTP 请求访问的资源。

package com.cheney.demo.modle;import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "t_user")
public class User {@Idprivate Integer id;private String name;private Integer age;
}

这个就和我们上一篇写的基础功能一致了,让我们访问一下,这个自定义查询的 URL 吧

localhost:8080/users

在这里插入图片描述

2. 查询方法(Query Methods)

通过方法命名规则,我们可以轻松地创建查询方法。以下是一个通过产品名称查询的例子:

package com.cheney.demo.repository;import com.cheney.demo.modle.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Integer> {// 自定义一个通过名字查询用户信息的方法User findByName(String name);
}

让我们访问一下,这个自定义查询的 URL 吧

localhost:8080/users/search/findByName?name=cheney

在这里插入图片描述

3. 分页和排序(Pagination and Sorting)

Spring Data REST 支持对资源进行分页和排序,以便处理大量数据。在查询参数中指定 pagesizesort,即可实现分页和排序。

package com.cheney.demo.repository;import com.cheney.demo.modle.User;import lombok.NonNull;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Integer> {// 自定义一个通过名字查询用户信息的方法User findByName(String name);// 分页和排序Page<User> findAll(@NonNull Pageable pageable);
}

这个 findAll 方法的目的是获取所有用户的数据,并支持分页和排序。参数 @NonNull Pageable pageable 表示通过传递 Pageable 对象来进行分页和排序。

让我们访问一下这个 URL 吧,来获取第一页的3条数据,并且指定了 id 升序

localhost:8080 /users?page=0&size=3&sort=id,asc

在这里插入图片描述

让我们访问一下这个 URL 吧,来获取第二页的3条数据,并且指定了 id 升序

localhost:8080 /users?page=1&size=3&sort=id,asc

在这里插入图片描述

4. 关联关系(Associations)

Spring Data REST 会自动检测实体之间的关联关系,并创建关联资源。例如,一个用户和多个角色之间的关联:

@Entity
public class User {@Idprivate Long id;@OneToManyprivate List<Role> roles;
}

5. 事件(Events)

通过监听事件,我们可以在资源的创建、更新、删除等操作时执行自定义逻辑。以下是一个简单的例子:

package com.cheney.demo.handler;import com.cheney.demo.modle.User;
import org.springframework.data.rest.core.annotation.HandleBeforeCreate;
import org.springframework.data.rest.core.annotation.RepositoryEventHandler;
import org.springframework.stereotype.Component;@Component
@RepositoryEventHandler(User.class)
public class UserEventHandler {@HandleBeforeCreatepublic void handleBeforeCreate(User user) {System.out.println("handleBeforeCreate user");}
}

通过 @RepositoryEventHandler(User.class) 注解,指定了这个事件处理器将处理与 User 类相关的事件。在事件处理器中,通过 @HandleBeforeCreate 注解标注的 handleBeforeCreate 方法表示,在创建(插入)用户之前执行的逻辑。在这个例子中,当有新的用户即将被创建时,会输出一条日志信息。

让我们访问一下这个 URL 吧,来获取第一页的3条数据,并且指定了 id 升序

localhost:8080 /users

在这里插入图片描述

查看一下日志,发现调用了我们定义的 handle 方法

在这里插入图片描述

6. 安全性(Security)

集成 Spring Security 可以实现对资源的安全控制。配置安全规则,限制对某些资源的访问权限。

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends GlobalMethodSecurityConfiguration {@Overrideprotected MethodSecurityExpressionHandler createExpressionHandler() {return new OAuth2MethodSecurityExpressionHandler();}
}
  • @EnableGlobalMethodSecurity(prePostEnabled = true)

    这个注解用于启用全局方法安全性,其中 prePostEnabled = true 表示启用 Spring Security 的 @PreAuthorize@PostAuthorize 注解,允许在方法级别进行访问控制。

  • GlobalMethodSecurityConfiguration

    它是用于配置全局方法安全性。通过继承这个类,可以进行一些自定义的配置。

  • createExpressionHandler() 方法:

    GlobalMethodSecurityConfiguration 类中,通过重写 createExpressionHandler() 方法,可以配置 Spring Security 表达式处理器(Expression Handler)。这个方法返回一个 MethodSecurityExpressionHandler 对象,用于解析和处理方法级别的安全性表达式。

  • OAuth2MethodSecurityExpressionHandler

    在这个具体的配置中,createExpressionHandler() 方法返回了一个 OAuth2MethodSecurityExpressionHandler 对象。这表示使用 OAuth 2.0 的方法安全性表达式处理器,该处理器与 OAuth 2.0 令牌一起工作,用于处理涉及 OAuth 2.0 认证和授权的方法级别安全性。

结语

通过本文的介绍,我们深入了解了 Spring Data REST 的一些常用功能。这些功能大大简化了构建 RESTful API 的过程,提高了开发效率。希望这些示例能够帮助你更好地使用 Spring Data REST 构建强大的 RESTful 服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“华为杯”杭州电子科技大学2023新生编程大赛---树

题目链接 Problem Description 给定一棵包含 n 个节点的带边权的树&#xff0c;树是一个无环的无向联通图。定义 xordist(u,v) 为节点 u 到 v 的简单路径上所有边权值的异或和。 有 q 次询问&#xff0c;每次给出 l r x&#xff0c;求 ∑rilxordist(i,x) 的值。 Input 测试…

JVM之内存模型带参数

Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里)&#xff1a; java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize256M ‐XX:MaxMetaspaceSize256M ‐jar xxxxxx.jar-Xss&#xff1a;每个线程的栈大小 -Xms&#xff1a;设置…

关于“Python”的核心知识点整理大全61

目录 注意 20.1.4 使用 jumbotron 设置主页的样式 index.html 20.1.5 设置登录页面的样式 login.html 20.1.6 设置 new_topic 页面的样式 new_topic.html 20.1.7 设置 topics 页面的样式 topics.html 元素&#xff0c;让它们在页面上显得大些&#xff08;见2&#xf…

imgaug库指南(三):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

prometheus与zabbix监控的对比介绍

一、普米与zabbix基本介绍 1、prometheus介绍 Prometheus的基本原理是Prometheus Server通过HTTP周期性抓取被监控组件的监控数据&#xff0c;任意组件只要提供对应的HTTP接口并且符合Prometheus定义的数据格式&#xff0c;就可以接入Prometheus监控。 工作流程大致分为收集数…

嵌入式Linux之MX6ULL裸机开发学习笔记(汇编LED灯点亮)

汇编LED驱动实验 1.驱动编写 首先创建在vscode上创建工作区&#xff0c;创建led.s汇编文件&#xff0c;然后编写以下程序 .global _start 全局标号 _start: /* 使能所有外设时钟 */ ldr r0,0x020c4068 CCGR0 ldr r1,0xffffffff 要向CCGR0写入的数据 str r1,[r0] 将0xff…

优化企业运营,深入探索SAP库存管理解决方案

SAP库存管理是SAP提供的一款领先的企业库存管理解决方案。它致力于帮助企业实现对库存的全面掌控&#xff0c;优化供应链管理&#xff0c;降低库存成本&#xff0c;提高客户满意度。这个功能强大的系统为企业提供了丰富的仓储管理功能&#xff0c;如库存盘点、物料追踪、供应商…

【LeetCode】150. 逆波兰表达式求值(ASCII码)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;150. 逆波兰表达式求值 代码随想录题解地址&#xff1a;代码随想录 题目简介 即将后缀表达式转换成中缀表达式并计算。 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 …

【编译原理】期末预习PPT前四章笔记II

看了看学校的ppt&#xff0c;记的比较随意O.o 因为我的考试范围里边没有简答所以概念什么的没怎么记 没有简答只有选择真是太好了嘿嘿嘿 目录 I. 概述&#xff08;好多字。。&#xff09; 一、高级语言的分类 1、体裁 2、执行方式 二、各种语言的执行方式 三、编译程序…

读算法霸权笔记11_微目标

1. 脸书 1.1. 一份请愿书属于脸书了&#xff0c;而社交网络的算法会对如何最大限度地利用这份请愿书做出判断 1.1.1. 脸书的算法在决定谁能看到我的请愿书时会把所有因素都考虑在内 1.2. 通过改变信息推送的方式&#xff0c;脸书研究了我们…

智能分析网关V4智慧港口码头可视化视频智能监管方案

一、需求背景 近年来&#xff0c;水利港口码头正在进行智能化建设&#xff0c;现场管理已经是重中之重。港口作为货物、集装箱堆放及中转机构&#xff0c;具有昼夜不歇、天气多变、环境恶劣等特性&#xff0c;安全保卫工作显得更加重要。港口码头的巡检现场如何高效、快捷地对…

5G工业物联网网关:连接未来的智能工业

在当今数字化时代&#xff0c;工业物联网正迅速崛起&#xff0c;并引领着全球工业的数字转型。而5G工业物联网网关作为实现IIoT的关键基础设施&#xff0c;在连接未来的智能工业中发挥着举足轻重的作用。 什么是5G工业物联网网关 5G工业物联网网关是连接工业设备和5G网络的关键…

(湖科大教书匠)计算机网络微课堂(下)

第四章、网络层 网络层概述 网络层主要任务是实习网络互连&#xff0c;进而实现数据包在各网络之间的传输 因特网使用TCP/IP协议栈 由于TCP/IP协议栈的网络层使用网际协议IP&#xff0c;是整个协议栈的核心协议&#xff0c;因此TCP/IP协议栈的网络层常称为网际层 网络层提供…

SpringBoot整合sentinel

1、引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 2、 配置文件添加 spring:cloud:sentinel:transport:dashboard: ip:8858 项目重启&#x…

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError 文章目录 【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError1. 报错的具体情况2. 解决过程3. 其他问题3.1 ModuleNotFoundError: No module named OpenGL3.2 ModuleNotFoundEr…

第84讲:基于各种场景使用mysqldump逻辑备份数据库

文章目录 1.mysqldump备份工具的语法格式2.使用mysqldump进行全库备份3.备份单个库或者多个库的数据4.备份某个库下的单表或者多表的数据5.mysqldump备份数据库时必加的一些参数5.1.基本参数5.2.核心参数 6.mysqldump备份数据库时的一些其他参数 1.mysqldump备份工具的语法格式…

Docker Compose--部署SpringBoot项目--实战

原文网址&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 简介 本文用实战介绍Docker Compose部署SpringBoot项目。 1.创建SpringBoot项目 Controller package com.knife.example.controller;import io.swagger.annotations.Api; import io.swagger.annot…

HTTP基础知识总结

目录 一、什么是HTTP&#xff1f; 二、与HTTP有关的协议 三、HTTP请求特征 四、HTTP组成格式 五、HTTP标头 1.通用标头 2.实体标头 3.请求标头 4.响应标头 六、HTTP状态码分类 我们在日常测试过程中&#xff0c;也可以通过浏览器F12简单定位是前端问题还是后端问题&a…

KeyError: ‘model_state_dict‘

问题 加载模型权重文件时获取model_state_dict键失败 解决 单步调试发现保存模型权重时正确保存了该键值对&#xff0c;再次调试时发现莫名奇妙又没错了 首先确认保存模型时的状态字典键名&#xff1a;确保在保存模型权重时&#xff0c;正确地使用了 model.state_dict() 方法…

局部与整体的关联特性,如图所示

局部与整体的关联特性是指事物的局部部分与整体之间存在一定的关联关系。它强调整体是由局部构成&#xff0c;局部又反向影响整体。具体包括以下几个方面的特性&#xff1a; 互依性&#xff1a;局部与整体相互依赖&#xff0c;一个的变动会影响另一个的变动。局部的变化会对整体…