java validate注解,validated注解对于类
目录
@Valid和@ Validated @ Valid compare with @ Validated @ Valid advanced use @ Valid cascade check @ Validated advanced use @ Validated grouping check @ Validated grouping check order @ Validated non-entity class check @ path variable正则表达式check继承了BasicErrorController类的自定义check批注。
@Valid和@Validated
00-1010相同点:s@Valid注释和@Validateds注释都是开启验证功能的注释。不同点:s@Validated注解是Spring.基于@Valid注解的进一步封装,并提供分组和分组顺序等高级功能,使用位置不同:@Valid注解3360可用于方法、构造器、方法参数和成员属性。@Validated注释3360可以用在类型、方法和方法参数中,但不能用在成员属性中。
@Valid和@Validated比较
00-1010级联校验:也称为嵌套检测。嵌套意味着一个实体类包含另一个实体类的@Valid和可以在成员属性中使用的字段,所以@Valid可以提供级联检查示例:@数据公共类hair { @ not blank(message= hair length must be submit!)私倍长;@NotBlank(message=发色必须提交!)私串色;} @ data public class person { @ not blank(message=必须提交用户名!)@Size(min=2,max=8)私有字符串用户名;//添加@Valid批注实现嵌套检测@Valid @NotEmpty(message=用户应该有头发!)私人列表Hair头发;} @PostMapping(/person )公共结果add Person(@ Valid @ request body Person Person){ return Result . build success(Person);}只要在方法参数前面加上@Valid和@Validated的注释,嵌套的实体类就不会被验证。为了验证嵌套实体类,您需要在嵌套实体类的属性上添加@Valid注释。
@Valid高级使用
00-1010分组校验:开启对指定组的校验,可以应用于不同业务场景的分组校验是@Validatedvalue校验注释中groups:提供的分组方法JSR 303注释中groups提供的分组方法。示例:@ data public class person group { public interface add group { }公共接口updategroup { }/@ validated annotation value方法指定在对UpdateGroup.class (message=必须提交用户ID!,groups=UpdateGroup.class)私有字符串id;//@Validated批注值方法验证@NotBlank(message=必须提交用户名!指定分组AddGroup.class或更新Group.class时,groups={AddGroup.class,UpdateGroup.class})私有字符串名称;//@ Validated Annotation value方法在对@Range(mi
n = 1, max = 200, message = "用户的年龄必须提交!") private int age;}开启分组校验: 通过 @Validated注解的value方法对指定的分组开启校验
@RestController@RequestMapping("/person")public class PersonGroupController {// 不指定分组时校验@GetMapping("/person")public Result getPerson(@Validated @RequestBody PersonGroup person) {return Result.buildSuccess(person);}// 指定AddGroup分组校验@PostMapping("/person")public Result addPerson(@Validated(value = PersonGroup.AddGroup.class) @RequestBody PersonGroup person) {return Result.buildSuccess(person);}// 指定UpdateGroup分组校验@PutMapping("/person")public Result updatePerson(@Validated(value = PersonGroup.updateGroup.class) @RequestBody PersonGroup person) {return Result.buildSuccess(person);}}校验方法添加groups的值来指定分组,只有使用 @Validated注解的value的值指定这个分组时,开会开启注解的校验数据的功能
@Validated分组校验顺序
默认情况下,分组间的约束是无序的,但是在一些特殊的情况下可能对分组间的校验有一定的顺序比如第二组的分组的约束的校验需要依赖第一组的稳定状态来进行,此时,要求分组间的约束校验一定要有顺序分组校验顺序通过使用 @GroupSequence注解实现示例:@Datapublic class UserGroupSequence {public interface FirstGroup {}public interface SecondGroup {}// 使用GroupSequence定义分组校验顺序:按照FirstGroup,SecondGroup分组顺序进行校验@GroupSequence({FirstGroup.class, SecondGroup.class})public interface Group {}@NotEmpty(message = "用户ID必须提交!", group = FirstGroup.class)private String userId;@NotEmpty(message = "用户姓名必须提交!", group = FirstGroup.class)@Size(min = 2, max = 8, message = "用户姓名的长度在2~8之间", goup = Second.class)private String userName;}
@RestController@RequestMapping("/user")public class UserGroupSequenceController {// 这里方法中@Validated注解value的值是Group.class@PostMapping("/user")public Result addGroup(@Validated(value = Group.class) @RequestBody UserGroupSequence user) {return Result.buildSuccess(user);}}使用 @GroupSequence注解指定分组校验顺序后,第一组分组的约束的校验没有通过后,就不会进行第二组分组的约束的校验
@Validated非实体类校验
在非实体类上添加 @Validated注解对非实体类进行校验@Validatedpublic class AnnotationController {@GetMapping("/person")public Result getAge(@Range(min = 2, max = 8, message = "年龄在3~8岁!") @RequestParam int age) {return Result.buildSuccess(age);}}在GlobalExceptionHandler中添加全局统一异常处理方法:
@ExceptionHandler(ConstraintViolationException.class)@ResponseBodypublic Result resolveConstraintViolationException(ConstraintVilationException exception) {Set<ConstraintVilation<?>> constraintVilations = exception.getConstraintVilations();// 处理异常信息if (!CollectionUtils.isEmpty(constraintVilations)) {StringBuilder messageBuilder = new StringBuilder();for (ConstraintVilation constraintViolation : constraintVilations) {messageBuilder.append(constraintVilation.getMessage()).append(",");}String errorMessage = messageBuilder.toString();if (errorMessage.length() > 1) {errorMessage.substring(0, errorMessage.length() - 1);}return Result.builderFailure(ErrorStatus.ILLEGAL_DATA.getCode(), errorMessage);} return Result.builderFailure(ErrorStatus.ILLEGAL_DATA.getCode(), exception.getMessage())}
@PathVariable
@PathVariable的作用: 用来指定请求URL路径里面的变量@PathVariable和 @RequestParam的区别:@PathVariable用来指定请求URL中的变量@RequestParam用来获取静态的URL请求入参
正则表达式校验
使用正则表达式校验 @PathVariable指定的路径变量// 请求路径中的id必须是数字,否则寻找不到这个路径404@GetMapping("/user/{id:\d+}")public Result getId(@PathVariable(name="id") String userId) {return Result.buildSuccess(userId);}
继承BasicErrorController类
@ControllerAdvice注解只能处理进入控制器方法抛出的异常BasicErrorController接口可以处理全局异常@PathVariable路径校验异常不是控制器方法抛出的,此时还没有进入控制器方法:BasicErrorController处理异常,比如404异常时,会跳转到 /error路径,此时会返回错误的html页面为了保证返回结果统一,继承BasicErrorController类,重写BasicErrorController接口中的错误处理方法@RestControllerpublic class PathErrorController extends BasicErrorController {@Autowiredpublic PathErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties, List<ErrorViewResolver> errorViewResolvers) {super(errorAttributes, serverProperties.getError(), errorViewResolvers);}/** * 处理html请求 */@Overridepublic ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {HttpStatus status = getStatus(request);Map<String, Object> model = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML));ModelAndView modelAndView = new ModelAndView("pathErrorPage", model, status);return modelAndView;}/** * 处理json请求 */@Overridepublic ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));Map<String, Object> responseBody = new HashMap<>(8);responseBody.put("success", false);responseBody.put("code", body.get("status"));responseBody.put("message", body.get("error")); return new ResponseEntity<>(responseBody, HttpStatus.OK);}}
自定义校验注解
使用场景:对某一个只能输入指定值的字段进行校验. 此时需要使用自定义注解实现定义自定义的注解 @Show :@Documented@Constraint(validateBy = {Show.ShowConstraintValidator.class})@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Rentation(RUNTIME)public @interface Show {String message() default "{com.oxford.annotation.Show.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};int[] value();class ShowConstraintValidator implements ConstraintValidator<Show, Integer> {private Set<Integer> set = new HashSet<>();/** * 初始化操作 * 获取value属性指定的数字,保存到Set集合中 */@Overridepublic void initilize(Show constraintAnnotation) {int[] value = constraintAnnotation.value();for (int v : value) {set.add(i);}}@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {return set.contains(value);}} }注意点:@Constraint注解:将自定义的注解和实现的校验类联系起来自定义校验注解类需要实现ConstraintValidator<A extends Annotation, T> 接口接口中第一个泛型参数表示的是自定义注解类接口中第二个泛型参数表示的是校验的属性的值的类型initialize() 方法:获取到自定义注解中的相关的数据isValid() 方法:实现自定义的校验逻辑返回boolean类型的校验结果自定义注解的使用:
@Datapublic class AnnotationQuery {@Show(value = {0, 1}, message = "数值只能是0或者1")private Integer isShow;}
@PostMapping("/annotation")public Result addAnnotation(@Validated @RequestBody AnnotationQuery annotation) {return Result.buildSuccess(annotation);}到此这篇关于Java中的三种校验注解的使用(@Valid,@Validated和@PathVariable)的文章就介绍到这了,更多相关Java 校验注解内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。