当前位置: 首页 > news >正文

【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 服务。

相关文章:

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

文章目录 1. 资源导出&#xff08;Resource Exporting&#xff09;2. 查询方法&#xff08;Query Methods&#xff09;3. 分页和排序&#xff08;Pagination and Sorting&#xff09;4. 关联关系&#xff08;Associations&#xff09;5. 事件&#xff08;Events&#xff09;6. …...

05-微服务-RabbitMQ-概述

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…...

jmeter参数化的三种方式

1.用户定义变量 使用变量&#xff1a; ${变量名} 这个变量是全局变量&#xff0c;也就是在下面子节点中都可以使用&#xff1b; 使用场景&#xff1a;两个账号分别有不同的权限&#xff0c;A经办&#xff0c;B审核。等。。。 2.CSV数据文件设置 3.函数...

java基础之Java8新特性-Lambda

目录 什么是Lambda表达式 Lambda表达式规范 基本语法 参数列表 函数体 注意事项 如何定义函数接口 1.保证接口中只能有一个抽象方法 2.使用FunctionalInterface注解标记该接口为函数接口 使用Lambda调用无参函数 使用Lambda调用有参函数 使用Lambda的精简写法 使用…...

入门使用mybatis-plus

第一步&#xff1a;pom文件带入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version> </dependency> 第二步&#xff1a;创建实体对象 TableName(&…...

ubuntu安装和配置ssh教程

一、前言 ssh服务类似于windows的远程桌面服务,可以实现对linux系统的远程管理,ssh默认端口为22端口。后面博主进行操作以ubuntu2020操作系统为例进行操作。 二、安装ssh服务 Ubuntu 2020 默认不安装 SSH 服务。它只安装了 SSH 客户端,可以用于连接到其他计算机上的 SSH 服…...

每天刷两道题——第六天

1.1字母异位词分组 给你一个字符串数组&#xff0c;将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词指的是由重新排列源单词的所有字母得到的一个新单词。 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,…...

时间序列平稳性相关检验方法

理解平稳性 一般来说&#xff0c;平稳时间序列是指随着时间的推移具有相当稳定的统计特性的时间序列&#xff0c;特别是在均值和方差方面。平稳性可能是一个比较模糊的概念&#xff0c;将序列排除为不平稳可能比说序列是平稳的更容易。通常不平稳序列有几个特征&#xff1a; …...

<leetcode修炼>双指针训练-移动零

题目: 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 方法1: 快慢指针 快指针负责遍历数组中所有元素&#xff0c;慢指针负责记录不为0的…...

Python初探:从零开始的编程奇妙之旅

一、Python是什么 Python是一门多用途的高级编程语言&#xff0c;以其简洁、易读的语法而脱颖而出。在深度学习领域&#xff0c;Python扮演着至关重要的角色。其丰富的科学计算库&#xff08;如NumPy、Pandas、Matplotlib&#xff09;和强大的深度学习框架&#xff08;如Tenso…...

算法与数据结构之链表<一>(Java)

目录 1、链表的定义 2、链表的特点 3、为何要使用链表 4、数组与链表的区别 5、链表的增删查 5.1、在头部插入链表 5.2、在中间插入链表 5.3、删除头节点 5.4、删除中间节点 5.5、查询某个值 6、链表的应用 6.1 如何设计一个LRU缓存算法&#xff1f; 6.2 约瑟夫问题 1、链表的定…...

目标检测COCO数据集与评价体系mAP

1.mAP 2.IoU IoU也就是交并比&#xff0c;也称为 Jaccard 指数&#xff0c;用于计算真实边界框与预测边界框之间的重叠程度。它是真值框与预测边界框的交集和并集之间的比值。Ground Truth边界框是测试集中手工标记的边界框&#xff0c;用于指定对象图像的位置以及预测的边界框…...

2024最全面且有知识深度的web3开发工具、web3学习项目资源平台

在Web3技术迅速发展的时代&#xff0c;寻找一个综合且深入的Web3开发工具和学习项目资源平台变得至关重要。今天&#xff0c;我将向大家介绍一个非常有价值的网站&#xff0c;它就是https://web3x.world 。 Web3X是一个全面而深入的Web3开发者社区&#xff0c;为开发者们提供了…...

Golang - defer关键字 深入剖析

defer关键字 defer和go一样都是Go语言提供的关键字。defer用于资源的释放&#xff0c;会在函数返回之前进行调用。一般采用如下模式&#xff1a; f,err : os.Open(filename) if err ! nil {panic(err) } defer f.Close()如果有多个defer表达式&#xff0c;调用顺序类似于栈&a…...

如何在Spring Boot中使用@Scheduled写定时任务判断数据量是否过大,过大则进行分表操作,多张表使用临时视图查询

当数据量过大&#xff0c;在定时任务中执行分表操作 1、复制表结构及数据 在xml中编写复制表结构及数据&#xff08;newTableName为新表名、originalTableName为原始表名&#xff09; 只复制表结构&#xff1a; CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTa…...

使用jieba库进行中文分词和去除停用词

jieba.lcut jieba.lcut()和jieba.lcut_for_search()是jieba库中的两个分词函数&#xff0c;它们的功能和参数略有不同。 jieba.lcut()方法接受三个参数&#xff1a;需要分词的字符串&#xff0c;是否使用全模式&#xff08;默认为False&#xff09;以及是否使用HMM模型&…...

C语言之分支与循环【附6个练习】

文章目录 前言一、什么是语句&#xff1f;1.1 表达式语句1.2 函数调用语句1.3 控制语句1.4 复合语句1.5 空语句 二、分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 练习&#xff08;1. 判断一个数是否为奇数 2. 输出1-100之间的奇数&#xff09; 2.2…...

使用通用MCU实现无人机飞行任务的快速二次开发

使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知&#xff0c;在以往TI电赛真题的学习…...

什么是Selinux

官网地址&#xff1a;What is SELinux? 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 概述 安全增强型 Linux (SELinux) 是Linux 系统的安全架构&#xff0c;允许管理员更好地控制谁可以访问系统。它最初是由美…...

计算机网络知识点

1. URI 和 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff09;&#xff0c;是对资源的引用和访问该资源的方法。俗称网址&#xff0c;就是浏览器地址栏里面的内容。 URL 语法为&#xff1a;protocol://userInfohost:port/p…...

Qt 连接 Mysql

Linux下安装mysql及qt连接_liunx下安装mysql及qt链接-CSDN博客...

HarmonyOS4.0系统性深入开发14AbilityStage组件容器

AbilityStage组件容器 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默…...

客服系统接入FastGPT

接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY&#xff0c;同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里&#xff0c;这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…...

Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正

问题描述 使用环境与工具&#xff1a;Unity 2022.3.4fc1&#xff0c;steam VR(2.7.3)&#xff0c;steamvrSDK&#xff08;1.14.15&#xff09;&#xff0c;HTC vive pro专业版&#xff0c;Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明&#xff08;可参考&#xff1a;HI5 2.0 交…...

广播及代码实现

广播&#xff08;Broadcast&#xff09;是一种网络通信方式&#xff0c;它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息&#xff0c;让所有设备都能接收并处理。在广播中&#xff0c;通信的目标是整个网络而不是特定的单个设备。 向子网中…...

QT应用篇 三、QML自定义显示SpinBox的加减按键图片及显示值效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.SpinBox组件2.SpinBox中QML的使用 总结 前言 记录自己学习QML的一些小技巧方便日后查找 QT的…...

2022年全国职业院校技能大赛网络安全竞赛试题1-10-B模块总结

前言 结尾有对22年国赛题型总结 试题1模块B 网络安全事件响应、数字取证调查和应用安全 B-1任务一&#xff1a;主机发现与信息收集 *任务说明&#xff1a;仅能获取Server1的IP地址 1.通过渗透机Kali2.0对靶机场景进行TCP同步扫描 (使用Nmap工具)&#xff0c;并将该操作使用…...

20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850

20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850 2023/12/28 12:30 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBr…...

php-fpm运行一段时间,内存不足

目录 一&#xff1a;原因分析 二&#xff1a;解决 三:观察系统情况 php-fpm运行一段时间&#xff0c;内存不足&#xff0c;是什么原因呢。 一&#xff1a;原因分析 1:首先php-fpm的配置 &#xff08;1&#xff09;启动的进程数 启动的进程数越多,占用内存越高; 2:其次…...

基于轻量级GhostNet模型开发构建生活场景下生活垃圾图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…...

汽车网站建设策划方案/设计网站官网

技术债务「技术债务」是开发团队在设计或架构选型时&#xff0c;从短期效应的角度选择了一个易于实现的方案。但从长远来看&#xff0c;这种方案会带来更消极的影响&#xff0c;亦即开发团队所欠的债务。简单的说就是为了快速地解决问题&#xff0c;而采取的不规范的方案。比如…...

网页此站点不安全/seo网站内部优化方案

说明 最近也有很多人来向我"请教"&#xff0c;他们大都是一些刚入门的新手&#xff0c;还不了解这个行业&#xff0c;也不知道从何学起&#xff0c;开始的时候非常迷茫&#xff0c;实在是每天回复很多人也很麻烦&#xff0c;所以在这里统一作个回复吧。 Java学习路…...

linux服务器怎么做网站/杭州seo哪家好

在 ASP.NET 中若要使用 CallBack 機制必需實作 System.Web.UI.ICallbackEventHandler 介面&#xff0c;若很多頁面都需要使用 CallBack 機制時&#xff0c;可以在 BasePage 實作 System.Web.UI.ICallbackEventHandler 介面就好&#xff0c;讓 BasePage 引發 CallBack 回呼的事件…...

国外设计网站app有哪些/台湾搜索引擎

编辑~/.bashrc文件&#xff0c;然后在最后加上你想设置的目录就可以了。 这样做之后就可以在终端中执行你想要的程序了&#xff0c;不过如果你使用其它程序在后台调用的话可能还是会调用不到&#xff0c;因为这个设置是针对bash有效的。 例如我现在使用eclipse来调用arm-none-e…...

西部网站建设/天堂网长尾关键词挖掘网站

1.进程和线程 进程&#xff1a; 计算机中程序关于某数据集合的一次运行活动&#xff0c;是计算机系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。 线程&#xff1a; 线程是进程的实例&#xff0c;是CPU进行资源分配和调度的最小单位&#xff0c;线程是轻量…...

如何做ppt课件/seo代理计费系统

1.虚拟IP 在 TCP/IP 的架构下&#xff0c;所有想上网的电脑&#xff0c;不论是用何种方式连上网路&#xff0c;都必须要有一个唯一的 IP-address。事实上IP地址是主机硬件地址的一种抽象&#xff0c;简单的说&#xff0c;MAC地址是物理地址&#xff0c;IP地址是逻辑地址。 虚拟…...