使用Hibernate Validator校验接口入参并使用自定义校验器

Hibernate Validator是用来做什么的?

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

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

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

引入依赖

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

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(限字符串)

创建测试类
注意必须先进行为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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值