本文主要介绍JSR303在Java中的基本使用细节。文章围绕主题,详细介绍细节,有一定的参考价值,有需要的朋友可以参考一下。
:
目录
1.关于JSR-3032。基本使用3。级联验证4。分组验证4.1定义接口,该接口用作标识4.2指定要验证的组5。组序列6。用户定义的验证注释7。验证结果的处理7.1全局异常处理7.2绑定请求7.3验证器
1.关于JSR-303
JSR-303规范(Bean验证规范)提供了一种在Java EE和Java SE中验证Java Bean的方法。该规范主要使用注释来实现Java Bean的验证功能。
Hibernate Validator提供了JSR 303规范中所有内置约束的实现,以及一些额外的约束。公文
Bean Validation 中内置的 constraint:
约束注解名称* *约束注释描述**@Null验证对象是否为空@NotNull验证对象是否不为空@AssertTrue验证布尔对象是否为真
@AssertFalse验证布尔对象是否为false@Min验证数字和字符串对象是否等于指定值@Max验证数字和字符串对象是否等于指定值。
@DecimalMin验证数字和字符串对象是否等于指定值,小数精度是否存在@DecimalMax验证数字和字符串对象是否等于指定值,小数精度是否存在。
@Size验证对象(数组、集合、映射、字符串)的长度是否在给定范围内@Digits验证数字和字符串的构成是否合法@Past验证日期和日历对象是否在当前时间之前。
@Future验证日期和日历对象是否晚于当前时间@Pattern验证String对象是否符合正则表达式的规则。
2. 基本使用
向参数添加检查注释,如果参数是用户定义的类型,则向类的属性添加检查注释。使验证注释生效2.1将验证注释直接添加到参数中,需要在类中添加@Validated2.1自定义类型,并在变量前面添加@Validated或@Valid。
@数据
公共类Emp {
//不能为空,也不能是空字符串
@NotBlank(message='账号不能为空')
私有字符串用户名;
}
@PostMapping('/emp/add ')
公共结果演示1(@有效雇员雇员,@非空字符串电子邮件){
Result.success (200,'成功');
}
@Validated和@Valid的区别
@Validated:
Spring提供了对分组检查的支持,分组检查可以用于类型、方法和方法参数。但是,它不能用于成员属性(字段)。因为不能添加到成员属性(字段)中,级联检查不能自己完成,需要@Valid配合。
@Valid:
JDK(标准JSR-303规范)不支持分组检查。可以用在方法、构造函数、方法参数和成员属性(字段)中,也可以添加到成员属性(字段)中单独完成级联检查。
3. 级联验证
要验证的pojo类,其中也包含要验证的对象。
@数据
公共类Emp实现Serializable {
//不能为空,也不能为空字符串(调用trim()后)
@NotBlank(message='账号不能为空')
私有字符串用户名;
@Valid //需要添加,否则无法验证Dept类中的检查注释。
@NotNull //并且需要先触发该字段的验证,才能进行嵌套验证。
私人部门;
}
@数据
公共类部门实现可序列化{
@NotBlank(message='deptNameb不能为空')
私有字符串deptName
}
4. 分组验证
验证时,仅验证特定的属性。不知道默认值是Default。
4.1定义接口,充当标识
公共接口IGroup {
接口注册表扩展默认{}
界面更新扩展了默认值{}
}
4.2 指定校验的组
@数据
公共类Emp实现Serializable {
//仅当选中的组更新时,才选中该字段
@NotNull(message=' number不能为空',groups={IGroup。Update.class})
@Min(value=1,groups={IGroup。Update.class})
私有整数empNo
//不能为空,也不能为空字符串(调用trim()后)
@NotBlank(message='账号不能为空')
私有字符串用户名;
@ pattern(regexp='^[0-9a-z]{10,18}$',message='密码只能使用数字字母,groups=IGroup .注册表。类)
私有字符串密码;
@有效
@NotNull
私人部门;
}
@PostMapping('/emp/add') //指定需要校验的组
公共结果添加EMP(@请求正文@已验证(I组.Registry.class) Emp emp){
返回结果.成功(200,’成功');
}
5. 组序列
指定组与组之间的检验顺序,如果第一个组校验没过,就不会校验后面的组
@GroupSequence({Default.class,IGroup .Update.class,IGroup .注册表。class})
公共接口IGroup {
接口注册表扩展默认{}
界面更新扩展了默认值{}
}
@PostMapping('/emp/add ')
公共结果添加Emp(@ request body @ Validated({ I group。class })Emp Emp){
返回结果.成功(200,’成功');
}
随便定义一个接口然后在接口上使用@组序列就行。
还有一个注解是@GroupSequenceProvider,使用这个注解需要实现DefaultGroupSequenceProvider接口,重写里面getValidationGroups方法,然后根据情况动态的添加需要需要校验的分组。
6. 自定义校验注解
按照官网的示例
检查当前字符串是否为全大写,或者全小写
定义模型:
公共接口案例模式{
String UPPER='大写;
字符串下限='小写;
}
创建自定义注解:
@Target({字段,方法,参数,批注类型,类型使用})
@保留(运行时)
@ Constraint(验证者=checkcasevalidator。class)//指定自定义验证器
@已记录
@Repeatable(CheckCase .List.class) //表示可以在同一位置重复多次
public @interface CheckCase {
//默认的错误信息
字符串消息()默认为“{ verification。默认。错误消息}”;
班级?[]组()默认{ };
班级?扩展负载[]负载()默认值{ };
字符串值();
@Target({字段,方法,参数,批注类型})
@保留(运行时)
@已记录
@接口列表{
检查case[]值();
}
}
创建自定义验证器,第一个泛型是自定义注解、第二个是校验值的类型,也就是注解标注的字段的类型
公共类CheckCaseValidator实现ConstraintValidatorCheckCase,String {
私有字符串案例模式
@覆盖
公共空的初始化(检查案例约束注释){
这个。案例模式=约束注释。value();
}
/**
* 判断是否通过校验
* @param值传入的值
* @param上下文
* @返回
*/
@覆盖
公共布尔值isValid(字符串值,ConstraintValidatorContext上下文){
if ( value==null ) {
返回真实的
}
如果(案例模式.UPPER.equals(caseMode) ) {
返回值。等于(值。toupper case());
}
否则{
返回价值。等于(值。tolowercase());
}
}
}
在资源目录下创建一个验证消息。属性配置文件,键是第二步消息设置的默认值,值是自定义错误信息10 .10 { value }为@检查案例的价值属性的值
验证。默认。错误消息=字母必须为全为{值}
7. 校验结果的处理
7.1 全局异常处理
@RestControllerAdvice
公共类GlobalExceptionHandler {
@异常处理程序(绑定异常。类)
public HashMapString,String BindException处理程序(BindException e){
HashMapString,String map=new HashMap();
e.getBindingResult().getFieldErrors().forEach(字段- {
map.put(field.getField()、field。getdefaultmessage());
});
返回地图;
}
@异常处理程序(methodargumentnotvalidexception。类)
public HashMapString,String methodargumentnotvaliexception(methodargumentnotvaliexception e){
HashMapString,String map=new HashMap();
e.getBindingResult().getFieldErrors().forEach(字段- {
map.put(field.getField()、field。getdefaultmessage());
});
返回地图;
}
@异常处理程序(constraintviolationexception。类)
公共HashMapString,字符串句柄(ConstraintViolationException e){
HashMapString,String map=new HashMap();
e.getConstraintViolations().forEach(项目-{
map.put(item.getPropertyPath().toString()、item。getmessage());
});
返回地图;
}
}
7.2 BindRequest
@PostMapping('/emp/test ')
公共结果测试(@Validated Emp emp,BindingResult validResult){
if (validResult.hasErrors()){
HashMapString,String map=new HashMap();
validResult.getFieldErrors().forEach(错误-{
map.put(error.getField()、error。getdefaultmessage());
});
返回结果.错误(HttpStatus .BAD_REQUEST.value(),map);
}
返回结果.成功(HttpStatus .OK.value(),'成功');
}
7.3 Validator
@SpringBootTest
公共类验证测试{
私有静态验证器验证器=验证。由提供者(hibernate验证程序。类)。配置()。failFast(false) //是否开启快速失败模式。buildValidatorFactory()。获取验证程序();
@测试
公共void test1(){
Emp Emp=new Emp();
//单独校验某个属性
//SetConstraintViolationEmp有效属性=验证器。验证属性(EMP,“username”);
//检验对象
SetConstraintViolationEmp有效bean=验证器。验证(EMP);
IteratorConstraintViolationEmp iterator=有效bean。迭代器();
while (iterator.hasNext()){
ConstraintViolationEmp next=iterator。next();
string属性=next。getpropertypath().toString();
字符串消息=下一条。getmessage();
系统。出去。println(property ':' message);
}
}
}
到此这篇关于Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)中JSR303的基本使用详情的文章就介绍到这了,更多相关Java JSR303内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。