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

news2024/11/26 10:32:48

文章目录

    • 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 {
    @Id
    private 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 {
    @Id
    private Long id;

    @OneToMany
    private 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 {
    @HandleBeforeCreate
    public 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 {
    @Override
    protected 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.coloradmin.cn/o/1357610.html

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

相关文章

【Go】excelize库实现excel导入导出封装(二),基于map、多个sheet、多级表头、树形结构表头导出,横向、纵向合并单元格导出

前言 大家好&#xff0c;这里是符华~ 之前写了一篇 go excelize库封装导入导出 的博客&#xff0c;然后那篇博客还挖了个坑&#xff0c;结果这个坑差点就填不上了&#x1f923;还好经过我的不懈努力&#xff0c;总算是把坑给填上了。。。 挖坑 上一篇文章中&#xff0c;我们…

使用fabric.js实现对图片涂鸦、文字编辑、平移缩放与保存功能

文章目录 背景1.初始化画布1.创建画布2.设置画布大小 2.渲染图片3.功能&#xff1a;开启涂鸦4.功能&#xff1a;添加文字5.旋转图片6.画布平移7.画布缩放8.保存图片9.上传图片10.销毁实例11.总结 背景 项目中有个需求&#xff0c;需要对图片附件进行简单的编辑操作&#xff0c…

网络故障问题一般性检查排查思路

一、基本连通性检查 在网络中ping是一个十分强大的TCP/IP工具。它可以用来检测网络的连通情况和分析网络速度、也可以ping网址根据域名得到服务器IP、同时我们根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 ping 网址&#xff0c;有几种输出情况&a…

【OpenCV】在MacOS上使用OpenCvSharp

前言 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;它具有C&#xff0c;Python&#xff0c;Java和MATLAB接口&#xff0c;并支持Windows&#xff0c;Linux&#xff0c;Android和Mac OS。OpenCvSharp是一个Op…

Flume基础知识(七):Flume 事务与 Flume Agent 内部原理

1. Flume 事务详解 2. Flume Agent 内部原理 重要组件&#xff1a; 1&#xff09;ChannelSelector ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型&#xff0c; 分别是 Replicating&#xff08;复制&#xff09;和 Multiplexing&#xff08;多…

如何计算非线性负载的功率需求?

非线性负载的功率需求计算是一个相对复杂的过程&#xff0c;因为非线性负载的电流和电压之间的关系不是简单的正比关系。在计算非线性负载的功率需求时&#xff0c;需要考虑负载的特性、工作状态以及电源电压等因素。 确定负载的类型&#xff1a;首先需要了解负载的具体类型&am…

MS713/MS713T:CMOS 低压、4Ω四路单刀单掷开关,替代ADG713

产品简述 MS713/MS713T 是一款单芯片 CMOS 4 路可选择开关&#xff0c;具有低 功耗、高开关速度、低导通阻抗、低漏电和高带宽特性。其工作 电压范围是 1.8V 到 5.5V &#xff0c;可以广泛应用在电池供电仪器仪表、新 一代的模数转换和数模转换系统中。其高带宽特性可用在 …

接口测试基础知识总结

一、HTTP 1、http请求头和响应头包含那些内容&#xff1f; 请求头信息 请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。 2、常用的请求报头如下&#xff1a; Accept&#xff1a;浏览器可接受的MIME类型。 l MIME用于设定某种扩展名的文件用哪种应…

ubuntu远程桌面连接之vnc

一、前言 ubuntu安装图形化桌面以后,有些时候出于需要会想要进行远程桌面连接。ubuntu想要进行远程桌面连接就需要vnc服务的支持,安装vnc的方法有很多,博主也试过一些方式,但是安装完后使用vnc连接工具发现是花屏,无法正常使用。后来发现一种简单的方式即可配置好vnc连接,…

计算机毕业设计 基于Java的供应商管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【赠书第16期】码上行动:用ChatGPT学会Python编程

文章目录 前言 1 ChatGPT简介 2 Python编程简介 3 使用ChatGPT学习Python编程 4 如何使用ChatGPT学习Python编程 5 推荐图书 6 粉丝福利 前言 随着人工智能技术的不断发展&#xff0c;聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中&#xff0c;ChatGP…

MEW-UNet:医学图像分割中的频域多轴表示学习

文章目录 摘要1、简介2、相关研究2.1、医学图像分割2.2、基于ViT的技术 3、我们的方法3.1、准备工作3.2、多轴外部权重块3.3、外部权重生成器 4、实验4.1、数据集4.2、实现细节4.3、与当前最佳方法的比较4.4、消融实验4.5、可视化 5、结论声明 摘要 https://arxiv.org/pdf/231…

uniapp 无限级树形结构面包屑、单选-多选、搜索、移除功能插件,基于【虚拟列表】高性能渲染海量数据,加入动态高度、缓冲区

hyq-tree-vtw 无限级树形结构面包屑、单选-多选、搜索、移除功能 示例项目 单选-user 单选-任意一项 多选-关联下级 多选-任意一项 已选择数据弹框 说明 本插件需要使用uni-popup、uni-transition用于已选择数据弹框&#xff0c;因此需要有这些依赖,请自行导入本插件基于【虚…

Maven多模块项目架构配置介绍和实战

项目采用的是Maven多模块架构&#xff0c;项目的部分子模块的pom.xml中重复引用了相同的JAR包。很明显&#xff0c;当初在配置Maven模块的时候&#xff0c;没有考虑清楚各个模块的架构职责&#xff0c;同时也不了解Maven模块依赖的传递性。主要介绍一下Maven多模块的配置思路和…

基于深度学习大模型实现离线翻译模型私有化部署使用,通过docker打包开源翻译模型,可到内网或者无网络环境下运行使用,可以使用一千多个翻译模型语言模型进行翻译

基于深度学习大模型实现离线翻译模型私有化部署使用,通过docker打包开源翻译模型,可到内网或者无网络环境下运行使用,可以使用一千多个翻译模型语言模型进行翻译,想要什么语种直接进行指定和修改就行。 环境要求,电脑内存低于8G建议不要尝试了,有无GPU都可以运行,但是有…

geemap学习笔记041:Landsat Collection2系列数据去云算法总结

前言 去云算法是进行数据处理中所要进行一步重要操作&#xff0c;Sentinal-2数据中已经提供了去云算法&#xff0c;但是Landsat Collection2系列数据中并没有提供去云算法&#xff0c;下面就以Landsat 8 Collection2为例进行介绍。 1 导入库并显示地图 import ee import gee…

http 503 错误

503错误是一种HTTP状态码&#xff0c;表示你请求的网站或服务暂时不可用&#xff0c;通常是因为服务器过载或维护&#xff0c;你可能会看到类似这样的提示&#xff1a;503 Service Unavailable、503 Service Temporarily Unavailable、HTTP Server Error 503、HTTP Error 503 I…

Linux_CentOS_7.9配置时区及NTPdate同步之简易记录

前言&#xff1a;ntpdate命令来自英文词组”NTPdate“的拼写&#xff0c;其功能是用于设置日期和时间。ntpdate命令能够基于NTP协议设置Linux系统的本地日期和时间&#xff0c;利用NTP服务的时钟过滤器来选择最优方案&#xff0c;大大提高了可靠性和精度&#xff0c;让系统时间…

Django 快速整合 Swagger:实用步骤和最佳实践

Django &#xff0c;作为 Python 编写的一个优秀的开源 Web 应用框架&#xff0c;特别适用于快速开发的团队。对于很多场景来说&#xff0c;我们需要一份 API 文档&#xff0c;好处实在太多了&#xff1a; 提高开发效率&#xff1a;开发者可以基于 API 文档 快速学习和尝试 AP…

网络安全与IP地址:构建数字世界的前沿堡垒

网络安全是当今数字社会中不可忽视的挑战之一。而IP地址&#xff0c;作为互联网通信的基础协议&#xff0c;既是数字化时代的桥梁&#xff0c;也是网络安全的关键节点。本文将剖析IP地址在网络安全领域的作用&#xff0c;以及如何利用其特性建立有效的网络安全策略。 IP地址&a…