iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring Boot 中怎么利用JSR303 实现参数验证
  • 567
分享到

Spring Boot 中怎么利用JSR303 实现参数验证

2023-06-05 04:06:52 567人浏览 泡泡鱼
摘要

今天就跟大家聊聊有关Spring Boot 中怎么利用jsR303 实现参数验证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Bean Validation 规范内嵌的约束注解实例基

今天就跟大家聊聊有关Spring Boot 中怎么利用jsR303 实现参数验证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Bean Validation 规范内嵌的约束注解

Spring Boot 中怎么利用JSR303 实现参数验证

实例

基本应用

引入依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-validation</artifactId></dependency>

给参数对象添加校验注解

@Datapublic class User {    private Integer id;    @NotBlank(message = "用户名不能为空")    private String username;    @Pattern(regexp = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$", message = "密码必须为8~16个字母和数字组合")    private String passWord;    @Email    private String email;    private Integer gender;}

Controller 中需要校验的参数Bean前添加 @Valid 开启校验功能,紧跟在校验的Bean后添加一个BindingResult,BindingResult封装了前面Bean的校验结果。

@RestController@RequestMapping("/user")public class UserController {    @PostMapping("")    public Result save (@Valid User user , BindingResult bindingResult)  {        if (bindingResult.hasErrors()) {            Map<String , String> map = new HashMap<>();            bindingResult.getFieldErrors().forEach( (item) -> {                String message = item.getDefaultMessage();                String field = item.getField();                map.put( field , message );            } );            return Result.build( 400 , "非法参数 !" , map);        }        return Result.ok();    }}

测试如下:

Spring Boot 中怎么利用JSR303 实现参数验证

异常的统一处理

参数校验不通过时,会抛出 BingBindException 异常,可以在统一异常处理中,做统一处理,这样就不用在每个需要参数校验的地方都用 BindingResult 获取校验结果了。

@Slf4j@RestControllerAdvice(basePackages = "com.itwolfed.controller")public class GlobalExceptionControllerAdvice {    @ExceptionHandler(value= {MethodArgumentNotValidException.class , BindException.class})    public Result handleVaildException(Exception e){        BindingResult bindingResult = null;        if (e instanceof MethodArgumentNotValidException) {            bindingResult = ((MethodArgumentNotValidException)e).getBindingResult();        } else if (e instanceof BindException) {            bindingResult = ((BindException)e).getBindingResult();        }        Map<String,String> errORMap = new HashMap<>(16);        bindingResult.getFieldErrors().forEach((fieldError)->                errorMap.put(fieldError.getField(),fieldError.getDefaultMessage())        );        return Result.build(400 , "非法参数 !" , errorMap);    }}

分组解决校验

新增和修改对于实体的校验规则是不同的,例如id是自增的时,新增时id要为空,修改则必须不为空;新增和修改,若用的恰好又是同一种实体,那就需要用到分组校验。

校验注解都有一个groups属性,可以将校验注解分组,我们看下@NotNull的源码

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })@Retention(RUNTIME)@Repeatable(List.class)@Documented@Constraint(validatedBy = { })public @interface NotNull {    String message() default "{javax.validation.constraints.NotNull.message}";    Class<?>[] groups() default { };    Class<? extends Payload>[] payload() default { };    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })    @Retention(RUNTIME)    @Documented    @interface List {        NotNull[] value();    }}

从源码可以看出 groups 是一个Class<?>类型的数组,那么就可以创建一个Groups.

public class Groups {    public interface Add{}    public interface  Update{}}

给参数对象的校验注解添加分组

@Datapublic class User {    @Null(message = "新增不需要指定id" , groups = Groups.Add.class)    @NotNull(message = "修改需要指定id" , groups = Groups.Update.class)    private Integer id;    @NotBlank(message = "用户名不能为空")    @NotNull    private String username;    @Pattern(regexp = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$", message = "密码必须为8~16个字母和数字组合")    private String password;    @Email    private String email;    private Integer gender;}

Controller 中原先的@Valid不能指定分组 ,需要替换成@Validated

@RestController@RequestMapping("/user")public class UserController {    @PostMapping("")    public Result save (@Validated(Groups.Add.class) User user)  {        return Result.ok();    }}

测试如下:

Spring Boot 中怎么利用JSR303 实现参数验证

自定义校验注解

虽然JSR303和SpringBoot-validator 已经提供了很多校验注解,但是当面对复杂参数校验时,还是不能满足我们的要求,这时候我们就需要 自定义校验注解。

例如User中的gender,用 1代表男 2代表女,我们自定义一个校验注解@ListValue,指定取值只能1和2。

创建约束规则
@Documented@Constraint(validatedBy = { ListValueConstraintValidator.class })@Target({ METHOD, FIELD, ANNOTATION_TYPE })@Retention(RUNTIME)public @interface ListValue {    String message() default "";    Class<?>[] groups() default { };    Class<? extends Payload>[] payload() default { };    int[] vals() default { };}

一个标注(annotation) 是通过@interface关键字来定义的. 这个标注中的属性是声明成类似方法
的样式的. 根据Bean Validation api 规范的要求:

  • message属性, 这个属性被用来定义默认得消息模版, 当这个约束条件被验证失败的时候,通过
    此属性来输出错误信息。

  • groups 属性, 用于指定这个约束条件属于哪(些)个校验组. 这个的默认值必须是Class<?>类型数组。

  • payload 属性, Bean Validation API 的使用者可以通过此属性来给约束条件指定严重级别. 这个属性并不被API自身所使用。

除了这三个强制性要求的属性(message, groups 和 payload) 之外, 我们还添
加了一个属性用来指定所要求的值. 此属性的名称vals在annotation的定义中比较特
殊, 如果只有这个属性被赋值了的话, 那么, 在使用此annotation到时候可以忽略此属性名称.

另外, 我们还给这个annotation标注了一些元标注( meta
annotatioins):

  • @Target({ METHOD, FIELD, ANNOTATION_TYPE }): 表示此注解可以被用在方法, 字段或者
    annotation声明上。

  • @Retention(RUNTIME): 表示这个标注信息是在运行期通过反射被读取的.

  • @Constraint(validatedBy = ListValueConstraintValidator.class): 指明使用哪个校验器(类) 去校验使用了此标注的元素.

  • @Documented: 表示在对使用了该注解的类进行javadoc操作到时候, 这个标注会被添加到
    javadoc当中.

创建约束校验器
import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import java.util.HashSet;import java.util.Set;public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {    private Set<Integer> set = new HashSet<>();        @Override    public void initialize(ListValue constraintAnnotation) {        int[] vals = constraintAnnotation.vals();        for (int val : vals) {            set.add(val);        }    }        @Override    public boolean isValid(Integer value, ConstraintValidatorContext context) {        return set.contains(value);    }}

ListValueConstraintValidator定义了两个泛型参数, 第一个是这个校验器所服务到标注类型(在我们的例子中即ListValue), 第二个这个校验器所支持到被校验元素的类型 (即Integer)。

如果一个约束标注支持多种类型的被校验元素的话, 那么需要为每个所支持的类型定义一个ConstraintValidator,并且注册到约束标注中。

这个验证器的实现就很平常了, initialize() 方法传进来一个所要验证的标注类型的实例, 在本
例中, 我们通过此实例来获取其vals属性的值,并将其保存为Set集合中供下一步使
用。

isValid()是实现真正的校验逻辑的地方, 判断一个给定的int对于@ListValue这个约束条件来说
是否是合法的。

在参数对象中使用@ListValue注解。

@Datapublic class User {    @Null(message = "新增不需要指定id" , groups = Groups.Add.class)    @NotNull(message = "修改需要指定id" , groups = Groups.Update.class)    private Integer id;    @NotBlank(message = "用户名不能为空")    @NotNull    private String username;    @Pattern(regexp = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$", message = "密码必须为8~16个字母和数字组合")    private String password;    @Email    private String email;    @ListValue( message = "性别应指定相应的值" , vals = {1,2} , groups = {Groups.Add.class , Groups.Update.class})    private Integer gender;}

测试如下:

Spring Boot 中怎么利用JSR303 实现参数验证

看完上述内容,你们对Spring Boot 中怎么利用JSR303 实现参数验证有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: Spring Boot 中怎么利用JSR303 实现参数验证

本文链接: https://www.lsjlt.com/news/241029.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Boot 中怎么利用JSR303 实现参数验证
    今天就跟大家聊聊有关Spring Boot 中怎么利用JSR303 实现参数验证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Bean Validation 规范内嵌的约束注解实例基...
    99+
    2023-06-05
  • Spring Boot怎么实现请求参数校验
    这篇文章主要介绍了Spring Boot怎么实现请求参数校验的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Boot怎么实现请求参数校验文章都会有所收获,下面我们一...
    99+
    2024-04-02
  • 利用Spring Boot怎么实现一个表单验证功能
    这期内容当中小编将会给大家带来有关利用Spring Boot怎么实现一个表单验证功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。所谓表单验证,即校验用户提交的数据的合理性的,比如是否为空了,密码长度是否...
    99+
    2023-05-31
    springboot 一个表
  • Kotlin + Spring Boot 请求参数验证的代码实例
    编写 Web 应用程序的时候,经常要做的事就是要对前端传回的数据进行简单的验证,比如是否非空、字符长度是否满足要求,邮箱格式是否正确等等。在 Spring Boot 中,可以使用 Bean Validation (JSR-303) 技术通过...
    99+
    2023-05-31
    spring boot 验证
  • spring-boot-starter-validation 校验参数的实现
    目录一、前言二、常用注解三、定义分组四、定义需要校验的对象五、在handler 即 Controller中 校验六、定义全局异常处理类七、测试效果八、嵌套对象的校验九、自定义注解(自...
    99+
    2024-04-02
  • Spring Boot怎么实现通用Auth认证
    这篇文章主要介绍“Spring Boot怎么实现通用Auth认证”,在日常操作中,相信很多人在Spring Boot怎么实现通用Auth认证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S...
    99+
    2023-06-29
  • 怎么在Spring boot中利用validation进行校验
    这篇文章主要为大家详细介绍了怎么在Spring boot中利用validation进行校验,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:前言接触springboot一年多,是时候摆脱这种校验方式了233 ,每...
    99+
    2023-06-06
  • 使用Spring Boot怎么样实现一个验证码生成功能
    这篇文章给大家介绍使用Spring Boot怎么样实现一个验证码生成功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、验证码生成类import java.awt.*;import java.awt.image.Bu...
    99+
    2023-05-31
    springboot spring boo
  • 怎么在Spring Boot中利用Redis实现session共享
    本篇文章给大家分享的是有关怎么在Spring Boot中利用Redis实现session共享,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入spring-boot-start...
    99+
    2023-05-30
    springboot session redis
  • Spring Boot中怎么利用Redis 实现缓存操作
    这期内容当中小编将会给大家带来有关Spring Boot中怎么利用Redis 实现缓存操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存的应用场景二、更新缓存的策略三、运行 springboot-...
    99+
    2023-06-17
  • Spring Boot中怎么利用Redis实现分布式锁
    Spring Boot中怎么利用Redis实现分布式锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。分布式锁介绍Spring Boot 实现 Redis 分布式锁在 sprin...
    99+
    2023-06-16
  • Spring Boot中怎么利用MybatisPlus实现逆向工程
    这篇文章将为大家详细讲解有关Spring Boot中怎么利用MybatisPlus实现逆向工程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一、创建表  我们先创建数据库表:sys_log...
    99+
    2023-06-20
  • php中如何使用filter_var实现参数验证
    这篇文章给大家分享的是有关php中如何使用filter_var实现参数验证的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先看看代码:<php class Util...
    99+
    2024-04-02
  • 怎么实现 Spring Boot 接口参数加密解密
    本篇内容主要讲解“怎么实现 Spring Boot 接口参数加密解密”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现 Spring Boot 接口参数加密解密”吧!加密解密本身并不是难事,...
    99+
    2023-06-17
  • Spring Boot用户注册验证的实现全过程记录
    目录1. 概述2. 创建User DTO Object3. 实现一个注册Controller4. 验证注册数据4.1 内置的验证4.2 自定义验证以检查电子邮件的有效性4.3 使用自...
    99+
    2024-04-02
  • spring boot结合kaptcha怎么实现一个验证码登陆功能
    本篇文章给大家分享的是有关spring boot结合kaptcha怎么实现一个验证码登陆功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入kaptcha所需要的jar包,我...
    99+
    2023-05-31
    springboot ptc kaptcha
  • Spring Boot中怎么利用JUnit 5实现单元测试
    这篇文章给大家介绍Spring Boot中怎么利用JUnit 5实现单元测试,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 忽略测试用例执行JUnit 4:@Test  @Ignore ...
    99+
    2023-06-16
  • 怎么在Spring Boot项目中利用JSR-380进行校验
    怎么在Spring Boot项目中利用JSR-380进行校验?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。介绍JSR-380 是 J2EE 的一个规范,用于校验实体属性,它是 ...
    99+
    2023-06-06
  • java中validation后台参数验证怎么用
    这篇文章主要介绍了java中validation后台参数验证怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言在后台开发过程中,对参数的校验成为开发环境不可缺少的一...
    99+
    2023-05-31
    java validation
  • 怎么在Spring MVC中利用ajax进行信息验证
    本篇文章为大家展示了怎么在Spring MVC中利用ajax进行信息验证,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。主要的方法有两种:var xmlhttp=new XMLHt...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作