iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么使用Bean Validation解决业务中参数校验
  • 632
分享到

怎么使用Bean Validation解决业务中参数校验

2023-06-20 18:06:12 632人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关怎么使用Bean Validation解决业务中参数校验,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。叙述Bean Validation是一个通过配置注解来验证参数的框架,它包

这篇文章将为大家详细讲解有关怎么使用Bean Validation解决业务中参数校验,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

叙述

Bean Validation是一个通过配置注解来验证参数的框架,它包含两部分Bean Validation api和Hibernate Validator。

Bean Validation API是Java定义的一个验证参数的规范。

Hibernate Validator是Bean Validation API的一个实现。

@Valid和Validated的比较

spring Validation验证框架对参数的验证机制提供了@Validated(Spring's jsR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。

@Valid : 没有分组功能,可以用在方法、构造函数、方法参数和成员属性(field)上,如果一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@valid,才能验证待验证对象中的成员属性

@Validated :提供分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,用在类型、方法和方法参数上。但不能用于成员属性(field)。

两者都可以用在方法入参上,但都无法单独提供嵌套验证功能,都能配合嵌套验证注解@Valid进行嵌套验证。

嵌套验证示例:

public class ClassRoom{    @NotNull    String name;        @Valid  // 嵌套校验,校验参数内部的属性    @NotNull    Student student;}
  @GetMapping("/room")   // 此处可使用 @Valid 或 @Validated, 将会进行嵌套校验    public String validator(@Validated ClassRoom classRoom, BindingResult result) {        if (result.hasErrors()) {            return result.getFieldError().getDefaultMessage();        }        return "ok";    }
BindingResult 的使用

BindingResult必须跟在被校验参数之后,若被校验参数之后没有BindingResult对象,将会抛出BindException。

@GetMapping("/room")    public String validator(@Validated ClassRoom classRoom, BindingResult result) {        if (result.hasErrors()) {            return result.getFieldError().getDefaultMessage();        }        return "ok";    }

不要使用 BindingResult 接收String等简单对象的错误信息。简单对象校验失败,会抛出 ConstraintViolationException。主要就是接不着,你要写也算是没关系…

  // ❌ 错误用法,也没有特别的错,只是 result 是接不到值。    @GetMapping("/room")    @Validated  // 启用校验    public String validator(@NotNull String name, BindingResult result) {        if (result.hasErrors()) {            return result.getFieldError().getDefaultMessage();        }        return "ok";    }

修改校验失败的提示信息

可以通过各个校验注解的message属性设置更友好的提示信息。

public class ClassRoom{    @NotNull(message = "Classroom name must not be null")    String name;        @Valid    @NotNull    Student student;}
 @GetMapping("/room")    @Validated    public String validator(ClassRoom classRoom, BindingResult result, @NotNull(message = "姓名不能为空") String name) {        if (result.hasErrors()) {            return result.getFieldError().getDefaultMessage();        }        return "ok";    }

message属性配置国际化的消息也可以的,message中填写国际化消息的code,在抛出异常时根据code处理一下就好了。

@GetMapping("/room")    @Validated    public String validator(@NotNull(message = "demo.message.notnull") String name) {        if (result.hasErrors()) {            return result.getFieldError().getDefaultMessage();        }        return "ok";    }
// message_zh_CN.propertiesdemo.message.notnull=xxx消息不能为空// message_en_US.propertiesdemo.message.notnull=xxx message must no be null

hibernate-validator 的使用

1.引入pom

<dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate-validator</artifactId>    <version>5.3.1.Final</version></dependency>

2.dto入参对象属性加入注解

@Datapublic class UserModel implements Serializable {    private String id;    @NotBlank(message = "用户名不能为空")    private String name;    @NotNull(message = "性别不能不填")    private Byte gender;    @NotNull(message = "年龄不能不填")    @Min(value = 0,message = "年龄必须大于0岁")    @Max(value = 150,message = "年龄必须小于150岁")    private Integer age;        @NotBlank(message = "手机号不能不填")    private String telphone;        private String reGISterMode;    private String thirdPartyId;    private String encrptPassward;}

方法一:3.controller方法入参加入校验(@Validated )

@GetMapping("/getUser")    public String validator(@Validated UserModel userModel , BindingResult result) {        if (result.hasErrors()) {            return result.getFieldError().getDefaultMessage();        }        return "ok";    }

方法二:3.自定义封装ValidatorImpl类

@Componentpublic class ValidatorImpl implements InitializingBean{    private Validator validator;    //实现校验方法并返回校验结果    public ValidationResult validate(Object bean){        final   ValidationResult result=new ValidationResult();        Set<ConstraintViolation<Object>> validate = validator.validate(bean);        if (validate.size()>0) {            result.setHasError(true);            validate.forEach(constraintViolation->{                String errMsg=constraintViolation.getMessage();                String propertyName=constraintViolation.getPropertyPath().toString();                result.getErrORMsgMap().put(propertyName,errMsg);            });        }        return result;    }    @Override    public void afterPropertiesSet() throws Exception {        this.validator= Validation.buildDefaultValidatorFactory().getValidator();    }}

方法二:4.自定义封装ValidationResult 类

public class ValidationResult {    public boolean hasError=false;    private Map<String,String> errorMsgMap=new HashMap<>();    //实现通用的通过格式化字符串信息获取错误结果的msg方法    public String getErrMsg(){        return StringUtils.join(errorMsgMap.values().toArray(),",");    }    public boolean isHasError() {        return hasError;    }    public void setHasError(boolean hasError) {        this.hasError = hasError;    }    public Map<String, String> getErrorMsgMap() {        return errorMsgMap;    }    public void setErrorMsgMap(Map<String, String> errorMsgMap) {        this.errorMsgMap = errorMsgMap;    }}

5.controller方法入参加入校验

   @Autowired   private ValidatorImpl validator;    @Override       @Transactional(rollbackFor = Exception.class)    public void register(UserModel userModel) throws BusinessException {        UserDo userDo=new UserDo();        if (userModel == null) {            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);        }  //validate进行入参校验       ValidationResult validate = validator.validate(userModel);        if (validate.isHasError()){            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,validate.getErrMsg());        }    }

Bean Validation 的约束

  • @Null 被注释的元素必须为 null

  • @NotNull 被注释的元素必须不为 null

  • @AssertTrue 被注释的元素必须为 true

  • @AssertFalse 被注释的元素必须为 false

  • @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值

  • @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

  • @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值

  • @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

  • @Size(max, min) 被注释的元素的大小必须在指定的范围内

  • @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内

  • @Past 被注释的元素必须是一个过去的日期

  • @Future 被注释的元素必须是一个将来的日期

  • @Pattern(value) 被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的约束

Hibernate Validator 附加的 constraint:

  • @Email 被注释的元素必须是电子邮箱地址

  • @Length 被注释的字符串的大小必须在指定的范围内

  • @NotEmpty 被注释的字符串的必须非空

  • @Range 被注释的元素必须在合适的范围内

关于“怎么使用Bean Validation解决业务中参数校验”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么使用Bean Validation解决业务中参数校验

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么使用Bean Validation解决业务中参数校验
    这篇文章将为大家详细讲解有关怎么使用Bean Validation解决业务中参数校验,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。叙述Bean Validation是一个通过配置注解来验证参数的框架,它包...
    99+
    2023-06-20
  • 如何使用Bean Validation 解决业务中参数校验
    前言 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有点麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长...
    99+
    2024-04-02
  • SpringBoot怎么使用validation做参数校验
    这篇文章主要介绍了SpringBoot怎么使用validation做参数校验的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么使用validation做参数校验文章都会有所收获,下面我们一起...
    99+
    2023-06-30
  • SpringBoot 中使用 Validation 校验参数的方法详解
    目录1. Validation 介绍1.1 Validation 注解1.2 @valid 和 @validated的区别2. SpringBoot 中使用 Validator 校验...
    99+
    2024-04-02
  • SpringBoot使用validation做参数校验说明
    目录1.添加依赖直接添加 hibernate-validator添加spring-boot-starter-validation添加spring-boot-starter-...
    99+
    2024-04-02
  • SpringBoot使用validation做参数校验的实现步骤
    1.添加依赖 直接添加 hibernate-validator <dependency> <groupId>org.hibern...
    99+
    2024-04-02
  • java中validation后台参数验证怎么用
    这篇文章主要介绍了java中validation后台参数验证怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言在后台开发过程中,对参数的校验成为开发环境不可缺少的一...
    99+
    2023-05-31
    java validation
  • SpringBoot参数校验之@Valid怎么使用
    这篇文章主要介绍“SpringBoot参数校验之@Valid怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot参数校验之@Valid怎么使用”文章能帮助大家解决问题。依赖&l...
    99+
    2023-07-02
  • 怎么在Spring boot中利用validation进行校验
    这篇文章主要为大家详细介绍了怎么在Spring boot中利用validation进行校验,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:前言接触springboot一年多,是时候摆脱这种校验方式了233 ,每...
    99+
    2023-06-06
  • Dubbo服务校验参数的解决方案
    目录一、背景二、解决方案2.1maven依赖2.2接口定义2.3Dubbo服务提供者端配置2.4Dubbo服务消费者端配置2.5验证参数校验三、定制Dubbo参数校验异常返回3.1V...
    99+
    2024-04-02
  • SpringBoot参数校验Validator框架怎么使用
    这篇“SpringBoot参数校验Validator框架怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringB...
    99+
    2023-07-02
  • springboot 中怎么校验参数格式
    本篇文章给大家分享的是有关springboot 中怎么校验参数格式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。springboot 参数格式校验@Validated 字面意思...
    99+
    2023-06-20
  • SpringBoot参数校验之@Validated的使用详解
    目录简介依赖用法1:不分组代码测试用法2:分组代码测试简介 说明 本文用示例说明SpringBoot的@Validated的用法。 依赖 <dependency> ...
    99+
    2024-04-02
  • SpringBoot参数校验之@Valid的使用详解
    目录简介依赖代码 测试测试1:缺少字段测试2:不缺少字段测试3:缺少字段,后端获取BindResult 简介 说明 本文用示例说明SpringBoot的@Vali...
    99+
    2024-04-02
  • 使用Spring MVC怎么对参数进行校验
    本篇文章为大家展示了使用Spring MVC怎么对参数进行校验,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 内嵌异常处理如果只是这个controller的异常做单独处理,那么就适合绑定这个co...
    99+
    2023-05-31
    springmvc
  • 关于SpringBoot中controller参数校验的使用
    目录单参数校验实体类校验分组校验嵌套校验自定义注解参数校验主要使用两个标签@Validated和@Valid; @Valid是Hibernate的注解校验,@Validated是sp...
    99+
    2023-01-15
    SpringBoot controller参数校验 SpringBoot 参数校验
  • SpringBoot中怎么实现请求参数校验
    在Spring Boot中,可以使用JSR 303规范中的注解来实现请求参数的校验。具体步骤如下: 在Controller类中的请...
    99+
    2024-03-08
    SpringBoot
  • SpringMVC中常用参数校验类注解使用示例教程
    目录一、环境准备二、常用的校验注解及示例三、校验类方法中的普通参数四、校验类方法中的自定义对象五、关于@Valid和@Validated的区别联系六、分组校验七、自定义校验注解一、环...
    99+
    2024-04-02
  • Springboot怎么使用filter对request body参数进行校验
    这篇文章主要为大家展示了“Springboot怎么使用filter对request body参数进行校验”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Springboot怎么使用fil...
    99+
    2023-06-29
  • java怎么自定义注解做参数校验
    在Java中,可以使用自定义注解来进行参数校验。以下是一个简单的示例: import java.lang.annotation.El...
    99+
    2023-10-26
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作