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

网友投稿 672 2022-12-16


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

引入依赖

org.hibernate

hibernate-validator

6.0.15.Final

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 {

@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 */

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring MVC 简单的hello world的实现
下一篇:Springbean的几种注入方式都了解吗
相关文章

 发表评论

暂时没有评论,来抢沙发吧~