【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 测试…

一篇文章学会如何在 NestJS 中使用 Redis 并基于 Redis 实现接口访问限频率

前言 在处理高频数据操作和大规模并发请求的场合&#xff0c;我们需要一种机制能够快速读取和缓存数据&#xff0c;这时 Redis 就闪亮登场了。Redis 是一个开源的内存中数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 NestJS 是一个灵活且模块化的Node.j…

frp透传软件最新toml格式的配置文件的使用

frp软件在0.52.0版本开始支持 toml格式的配置文件了&#xff0c;并将在后继某个版本开始取消对 ini配置格式的支持。这里做一下新旧配置文件的比较。 一、frps 服务端配置文件的变化 frps.ini cat /etc/frp/frps.ini[common] bind_port7000 vhost_http_port8080 vhost_https…

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;如库存盘点、物料追踪、供应商…

JAVA批量新增、批量修改

JAVA批量新增、批量修改 若数据量非常大&#xff0c;可以把List拆成多份&#xff0c;每份1000条数据。NetPointDTO批量新增SQL.xml批量修改SQL.xml 若数据量非常大&#xff0c;可以把List拆成多份&#xff0c;每份1000条数据。 import cn.hutool.core.collection.ListUtil; im…

Unity Enum位掩码(BitMask)的运用

Unity Enum位掩码&#xff08;BitMask&#xff09;的运用 前言项目使用场景代码编写定义技能枚举角色类学习技能检查技能 添加并设置脚本运行效果总结 感谢 前言 在Unity游戏开发中&#xff0c;我们经常会面临需要对一组相关的状态进行管理的情况。Enum位掩码是一种有效的方法…

Spring 与 SpringBoot:一窥两者的奥秘与差异

随着 Java 开发领域的不断演进&#xff0c;Spring 框架已经成为了许多企业级应用的首选。然而&#xff0c;近年来&#xff0c;随着 SpringBoot 的兴起&#xff0c;许多开发者开始对其产生了浓厚的兴趣。尽管 SpringBoot 和 Spring 都来自于同一个家族&#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;安全保卫工作显得更加重要。港口码头的巡检现场如何高效、快捷地对…

16.Linux Bash Shell通过`read`命令读取用户输入

文章目录 Linux Shell获取用户输入处理简单输入控制等待隐藏输入从文件中读取 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Linux Shell获取用户输入 处理简单输入 shell与用户交互式输入使用的是read命令&#xff0c;一个简单的例子…

nuxt3 服务端请求其他接口犯的问题与解决

目的 老项目迁移到 nuxt3&#xff0c;为了减少代码修改量&#xff0c;打算封装一个在服务端运行的请求函数&#xff0c;用于在服务端渲染页面的同时&#xff0c;将接口数据请求回来一起返回给客户端 在服务端请求接口并渲染到页面上、在客户端不请求该接口&#xff0c;但需要能…

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

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

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

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