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(限字符串) |
引入依赖
<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、html" target="_blank">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 */ }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
在@Open注解中有一个属性needToken,用来告诉网关是否校验token /** * 是否需要appAuthToken,设置为true,网关端会校验token是否存在 */ boolean needToken() default false; 使用方式: @ApiOperation(value="传递token", notes = "传递token") @Open(value = "sto
本文向大家介绍Hibernate Validation自定义注解校验的实现,包括了Hibernate Validation自定义注解校验的实现的使用技巧和注意事项,需要的朋友参考一下 情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validatio
我试图用Hibernate Validation 6.0.1定义约束定义,其中验证器位于相对于约束注释的不同位置(.jar/项目)。Aka,我有我想要验证的对象,它们位于带有注释定义的项目“api”中,但我将在项目“modules/common”中有验证器 我遵循文档中的描述。 配置文件 约束注释 验证器 我的问题我的问题是,如果我没有将“@约束(validatedby={})”放在注释中,我会得
那里是自定义验证器: 当我调用时,我在插入的的上得到了一个。 我假设Spring会正确地注入定制验证器,我必须告诉他。但是,我不知道怎么做。我已经尝试了一些通过堆栈溢出和谷歌找到的东西,但没有运气。 任何帮助都将不胜感激。
我有以下验证器,用于验证更新请求。 object.getIdCreditor()有一个值,但是findById方法的执行["CreditorRepository.findById(object.getIdCreditor())" ] 进入NullPointer异常 我不明白怎么了。
本文向大家介绍Springboot 自定义校验代码实例,包括了Springboot 自定义校验代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Springboot 自定义校验代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 StartWithValidation.class StartWithValidator.clas