Hibernate validator使用以及自定义校验器注解
JSR-303是JAVAEE6中的一项子规范,叫做BeanValidation,用于对JavaBean中的字段的值进行验证。HibernateValidator则是Hibdernate提供的一种对该规范的实现。
——即HibernateValidator是用来做参数校验。
使用HibernateValidator提供的注解进行参数校验
引入依赖
org.hibernate hibernate-validator 6.0.15.Final
HibernateValidator常用注解
创建测试类
注意必须先进行为null判断,否则其他注解有的不会生效。
比如username加了@Length而不加@NotNull注解,当没有输入username,那么@Length判断将不会生效,判断为null的有@NotNull、@NotEmpty以及@NotBlank
建议自行去掉@NotNull再测试一下
packagecom.dfyang.validator.entity; importorg.hibernate.validator.constraints.Length; importorg.hibernate.validator.constraints.Range; importjavax.validation.constraints.NotBlank; publicclassUser{ @NotBlank(message="名称不能为空") privateStringname; @Range(min=1,max=120,message="年龄必须为1-120岁") privateIntegerage; @NotBlank(message="描述不能为空") privateStringdescription; @NotNull @Length(min=6,max=18,message="用户名长度必须为6-18位") privateStringusername; @NotNull @Length(min=6,max=18,message="密码长度必须为6-18位") privateStringpassword; /**get、set方法*/ }
创建测试Controller
@Valid用在参数上,表示对该参数进行校验。
如果对参数校验发现有误,会将错误注入到BindingResult中
我们这里将错误进行打印,也可以直接抛出异常
packagecom.dfyang.validator.controller; importcom.dfyang.validator.entity.User; importorg.springframework.validation.BindingResult; importorg.springframework.validation.ObjectError; importorg.springframework.web.bind.annotation.GetMapping; importorg.springframework.web.bind.annotation.ResponseBody; importorg.springframework.web.bind.annotation.RestController; importjavax.validation.Valid; @RestController publicclassUserController{ @GetMapping("/insert") @ResponseBody publicUserinsertUser(@ValidUseruser,BindingResultresult){ if(result.hasErrors()){ for(ObjectErrorerror:result.getAllErrors()){ System.err.println(error.getDefaultMessage()); } } returnuser; } }
输入http://localhost:8080/insert?name=张三&descripyion=&age=0&username=123123
使用自定义校验器进行参数校验
创建自定义注解,用于判断年龄是否符合约束
packagecom.dfyang.validator.constraint; importjavax.validation.Constraint; importjavax.validation.Payload; importjava.lang.annotation.ElementType; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importjava.lang.annotation.Target; /** *性别约束 */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=SexConstraintValidator.class) public@interfaceSex{ Stringmessage()default"性别有误"; Class>[]groups()default{}; Class[]payload()default{}; }
判断注解的值是否符合约束,这里进行了为null判断,也可以不进行在多加一个@NutNull
packagecom.dfyang.validator.constraint; importjavax.validation.ConstraintValidator; importjavax.validation.ConstraintValidatorContext; /** *性别约束逻辑判断 */ publicclassSexConstraintValidatorimplementsConstraintValidator{ @Override publicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){ returnvalue!=null&&(value.equals("男")||value.equals("女")); } }
@Target用于指定使用范围,该处限定只能在字段上使用
@Retention(RetentionPolicy.RUNTIME)表示注解在运行时可以通过反射获取到
@Constraint(validatedBy=xxx.class)指定该注解校验逻辑
2.创建校验实体,使用HibernateValidator自带注解以及自定义的注解
packagecom.dfyang.validator.entity; importcom.dfyang.validator.constraint.Sex; importorg.hibernate.validator.constraints.Length; importorg.hibernate.validator.constraints.Range; importjavax.validation.constraints.NotBlank; importjavax.validation.constraints.NotNull; publicclassUser{ @NotBlank(message="名称不能为空") privateStringname; @Range(min=1,max=120,message="年龄必须为1-120岁") privateIntegerage; @Sex privateStringsex; @NotBlank(message="描述不能为空") privateStringdescription; @NotNull(message="用户名不能为空") @Length(min=6,max=18,message="用户名长度必须为6-18位") privateStringusername; @NotNull(message="密码不能为空") @Length(min=6,max=18,message="密码长度必须为6-18位") privateStringpassword; /**省略get、set*/ }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。