Hibernate validator使用以及自定义校验器注解

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,用于对 Java Bean 中的字段的值进行验证。Hibernate Validator则是Hibdernate提供的一种对该规范的实现。

——即Hibernate Validator是用来做参数校验。

使用Hibernate Validator提供的注解进行参数校验

注解 释义
@Null 必须为null
@NotNull 不能为null
@AssertTrue 必须为true
@AssertFalse 必须为false
@Min 必须为数字,其值大于或等于指定的最小值
@Max 必须为数字,其值小于或等于指定的最大值
@DecimalMin 必须为数字,其值大于或等于指定的最小值
@DecimalMax 必须为数字,其值小于或等于指定的最大值
@Size 集合的长度
@Digits 必须为数字,其值必须再可接受的范围内
@Past 必须是过去的日期
@Future 必须是将来的日期
@Pattern 必须符合正则表达式
@Email 必须是邮箱格式
@Length 长度范围
@NotEmpty 不能为null,长度大于0
@Range 元素的大小范围
@NotBlank 不能为null,字符串长度大于0(限字符串)

引入依赖

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

Hibernate Validator常用注解

创建测试类

注意必须先进行为null判断,否则其他注解有的不会生效。
比如username加了@Length而不加@NotNull注解,当没有输入username,那么@Length判断将不会生效,判断为null的有@NotNull、@NotEmpty以及@NotBlank
建议自行去掉@NotNull再测试一下

package com.dfyang.validator.entity;

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;

public class User {
 @NotBlank(message = "名称不能为空")
 private String name;

 @Range(min = 1, max = 120, message = "年龄必须为1-120岁")
 private Integer age;

 @NotBlank(message = "描述不能为空")
 private String description;

 @NotNull
 @Length(min = 6, max = 18, message = "用户名长度必须为6-18位")
 private String username;

 @NotNull
 @Length(min = 6, max = 18, message = "密码长度必须为6-18位")
 private String password;

 /** get、set方法 */
}

创建测试Controller

@Valid用在参数上,表示对该参数进行校验。

如果对参数校验发现有误,会将错误注入到BindingResult中

我们这里将错误进行打印,也可以直接抛出异常

package com.dfyang.validator.controller;

import com.dfyang.validator.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
public class UserController {

 @GetMapping("/insert")
 @ResponseBody
 public User insertUser(@Valid User user, BindingResult result) {
  if (result.hasErrors()) {
   for (ObjectError error : result.getAllErrors()) {
    System.err.println(error.getDefaultMessage());
   }
  }
  return user;
 }
}

输入 http://localhost:8080/insert?name=张三&descripyion=&age=0&username=123123

使用自定义校验器进行参数校验

创建自定义注解,用于判断年龄是否符合约束

package com.dfyang.validator.constraint;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 性别约束
 */
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SexConstraintValidator.class)
public @interface Sex {

 String message() default "性别有误";

 Class<?>[] groups() default { };

 Class<? extends Payload>[] payload() default { };
}

判断注解的值是否符合约束,这里进行了为null判断,也可以不进行在多加一个@NutNull

package com.dfyang.validator.constraint;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 性别约束逻辑判断
 */
public class SexConstraintValidator implements ConstraintValidator<Sex, String> {
 @Override
 public boolean isValid(String value, ConstraintValidatorContext context) {
  return value != null && (value.equals("男") || value.equals("女"));
 }
}

@Target用于指定使用范围,该处限定只能在字段上使用
@Retention(RetentionPolicy.RUNTIME)表示注解在运行时可以通过反射获取到
@Constraint(validatedBy = xxx.class)指定该注解校验逻辑

2.创建校验实体,使用Hibernate Validator自带注解以及自定义的注解

package com.dfyang.validator.entity;

import com.dfyang.validator.constraint.Sex;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

public class User {
 @NotBlank(message = "名称不能为空")
 private String name;

 @Range(min = 1, max = 120, message = "年龄必须为1-120岁")
 private Integer age;

 @Sex
 private String sex;

 @NotBlank(message = "描述不能为空")
 private String description;

 @NotNull(message = "用户名不能为空")
 @Length(min = 6, max = 18, message = "用户名长度必须为6-18位")
 private String username;

 @NotNull(message = "密码不能为空")
 @Length(min = 6, max = 18, message = "密码长度必须为6-18位")
 private String password;

 /** 省略get、set */
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring MVC+FastJson+hibernate-validator整合的完整实例教程

    一:hibernate-validator 基础 1. 简介: 通过使用注解Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值的合法性. 2. 作用: 在API接口开发中参数校验是非常重要的事情,因为客户端很可能会少传参数,或者值不合法,甚至参数值是恶意的,所以对客户端传来的参数的合法性就必须要校验了,其中将参数值的校验规则通过注解的形式注解到属性上是一种比较优雅的方式. 3. 常用的约束注解 @Null 被注释的元素必须为 null @NotNull

  • Hibernate Validator实现更简洁的参数校验及一个util

    代码地址 https://github.com/wheel-organization/wheel 简介 hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现,hibernate-validator除了提供了JSR 303规范中所有内置constraint 的实现,还有一些附加的constraint. 使用hibernate-validator能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便

  • springboot使用hibernate validator校验方式

    一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码 hibernate validator(官方文档)提供了一套比较完善.便捷的验证实现方式. spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖. 二.hi

  • spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)

    创建项目 使用IDEA创建一个spring-boot项目,依赖选上 web, validation, freemarker 即可 先看看效果 创建实体类 创建并加上注解,代码如下 public class Person implements Serializable { @NotNull @Length(min = 3, max = 10) // username长度在3-10之间 private String username; @NotNull @Min(18) // 年龄最小要18岁 pr

  • SpringBoot 使用hibernate validator校验

    本文将全面的介绍如何使用 validator 进行数据校验 本文源码: https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate 准备工作 我们只需要引入 spring-boot-starter-web 包即可使用 1.常用注解 常用注解 2.简单的实体校验 public class CardDTO { @NotBlank private String cardId; @Size

  • Hibernate validator使用以及自定义校验器注解

    JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,用于对 Java Bean 中的字段的值进行验证.Hibernate Validator则是Hibdernate提供的一种对该规范的实现. --即Hibernate Validator是用来做参数校验. 使用Hibernate Validator提供的注解进行参数校验 注解 释义 @Null 必须为null @NotNull 不能为null @AssertTrue 必须为true @AssertFals

  • Angular在模板驱动表单中自定义校验器的方法

    引言 模板驱动表单相比较响应式表单可以少更少的代码做同样的事情,可也损失了自由度与更易测试,当然很多人并不在乎啦. 所以我相信很多人在编写Angular不自由自主去更倾向于模板驱动表单的写法. 表单最核心的是校验体验,在Angular中简直就是发挥到了极致,比如:required.min.max.pattern 等,这些原本是HTML DOM元素中的表述,而Angular默认实现了一整套的校验指令,比如:required 对应 RequiredValidator. 然后很多时候我们需要一些特殊的

  • zf框架的校验器使用使用示例(自定义校验器和校验器链)

    复制代码 代码如下: <?phprequire_once("Zend/Loader.php");//引入校验器类和效验器的功能类(Int),与自定义接口类;Zend_Loader::loadClass('Zend_Validate');Zend_Loader::loadClass('Zend_Validate_Int');Zend_Loader::loadClass('Zend_Validate_Interface');//增加自定义校验器功能类(GongBeiNum)[公倍数]

  • Java如何使用JSR303校验数据与自定义校验注解

    一.自带校验注解实现数据校验 1.web项目导入依赖 <!-- 该依赖默认导入了 hibernate-validator 所以不需要再单独导入 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 下图可以看到spring-boot

  • 一篇文章教你如何用Java自定义一个参数校验器

    目录 注解 校验器 异常处理 测试 总结 自定义一个唯一字段校验器 注解 @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {IsUniqueValidator.class}) // 指定自定义的校验器 public @interface IsUnique { // 提示信息 String message() default "";

  • Zend Framework常用校验器详解

    本文实例讲述了Zend Framework常用校验器.分享给大家供大家参考,具体如下: Date日期校验器 代码: <?php require_once 'Zend/Validate/Date.php'; function c_date($date){ $validator = new Zend_Validate_Date(); if($validator->isValid($date)){ echo "输入的日期格式:"; echo $date."有效!<

  • Spring中校验器(Validator)的深入讲解

    前言 Spring框架的 validator 组件,是个辅助组件,在进行数据的完整性和有效性非常有用,通过定义一个某个验证器,即可在其它需要的地方,使用即可,非常通用. 应用在执行业务逻辑之前,必须通过校验保证接受到的输入数据是合法正确的,但很多时候同样的校验出现了多次,在不同的层,不同的方法上,导致代码冗余,浪费时间,违反DRY原则. 每一个控制器都要校验 过多的校验参数会导致代码太长 代码的复用率太差,同样的代码如果出现多次,在业务越来越复杂的情况下,维护成本呈指数上升. 可以考虑把校验的代

  • 浅谈自定义校验注解ConstraintValidator

    目录 一.前言 二.自定义参数校验器 三.使用自定义注解 一.前言 系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的.所以我们可能会写大量的if else等判断逻辑,特别是在不同方法出现相同的数据时,校验的逻辑代码会反复出现,导致代码冗余,阅读性和可维护性极差. JSR-303是Java为Bean数据合法性校验提供的标准框架,它定义了一整套校验注解,可以标注在成员变量,属性方法等之上. hibernate-validator就提供了这套标准的实现,我们在用Springboot开

  • 如何通过自定义spring invalidator注解校验数据合法性

    目录 自定义spring invalidator注解校验数据合法性 1.定义校验属性字符串长度的注解 2.实现校验逻辑,校验失败后返回错误提示 3.在模型字段属性上增加校验的注解 4.提供统一的校验方法 5.业务层调用校验方法 springboot 参数验证 validation 1.综述 2.依赖 3.定义实体类 4.创建rest controller 5.实现ExceptionHandler 6.写测试代码 7.跑测试 8.自定义注解 自定义spring invalidator注解校验数据合

随机推荐