前端框架选型是企业提升开发效率与用户体验的关键因素
1052
2023-06-29
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
必须符合正则表达式
必须是邮箱格式
@Length
长度范围
@NotEmpty
不能为null,长度大于0
@Range
元素的大小范围
@NotBlank
不能为null,字符串长度大于0(限字符串)
引入依赖
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~