JSR303校验的应用步骤
- 给Bean增加校验注解:javax.validation.contrains, 并定义本人的message提示信息
- 开启校验性能,在具体的办法参数中增加@Valid;这样校验出错是会有默认的谬误响应信息
- 给校验的bean前面紧跟一个BindingResult参数, 就能够获取到校验的后果
分组校验(实现多场景的简单校验)
1.比方增加时必须为空;批改时不能为空的字段@Null(groups={AddGroup.class})@NotNull(groups={UpdateGroup.class})private Long brandId;
2.给校验注解标注什么状况下进行校验
@RequestMapping("/update")public R update(@Validated(value={UpdateGroup.class}) @RequestBody BrandEntity brand){...}
3.留神点:
1. 实体类上没有增加groups时,如果应用了分组校验,例如`@Validated(value={AddGroup.class})`,将不会对该字段进行校验2. 实体类上没有增加groups时,如果不增加校验分组,例如只用`@Validated`,则会对该字段进行校验
对立的异样解决
在解决校验后果是,如果再每一个解决办法中都进行一场的解决比拟繁琐,咱们能够应用SpringMVC为咱们提供的@ControllerAdvice进行对立的异样解决
- 应用步骤
- 编写异样解决类, 并在类上增加@ControllerAdvice
- 在类中增加异样解决的办法, 并在办法上增加@ExceptionHandler
- 实例
/*集中处理所有异样*/@Slf4j//@ResponseBody//@ControllerAdvice(basePackages = "com.atguigu.gulimall.product")@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product")public class GulimallExceptionControllerAdvice { @ExceptionHandler(value = MethodArgumentNotValidException.class) public R handleException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); Map<String, String> map = new HashMap<>(); bindingResult.getFieldErrors().forEach((item) -> { String message = item.getDefaultMessage(); String field = item.getField(); map.put(field, message); }); log.error("数据校验呈现问题{},异样类型:{}", e.getMessage(), e.getClass()); return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", map); } @ExceptionHandler(value = Throwable.class) public R handleThrowable(Throwable e) { log.error("数据校验呈现问题{},异样类型:{}", e.getMessage(), e.getClass()); return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg()); }}
自定义的校验
1.编写一个校验注解
2.编写一个校验器 ConstrainValidator
3.关联校验注解和校验器
例子:
@ListValue(vals={0,1})private Integer showStatus;
示例:
pom文件中增加依赖
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version></dependency>
java代码如下:
package com.atguigu.common.valid;import javax.validation.Constraint;import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import javax.validation.Payload;import java.lang.annotation.*;import java.util.HashSet;import java.util.Set;@Documented/*3. 将校验器和自定义注解关联*/@Constraint(validatedBy = {ListValueConstrainValidator.class})@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})@Retention(RetentionPolicy.RUNTIME)/*1.自定义校验器ListValue*/public @interface ListValue { String message() default "{com.atguigu.common.valid.ListValue.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; // 无效的值 int[] vals() default {};}/*2.自定义的校验器, 须要实现ConstraintValidator*/class ListValueConstrainValidator implements ConstraintValidator<ListValue, Integer> { Set<Integer> set = new HashSet<Integer>(); @Override public void initialize(ListValue constraintAnnotation) { int[] vals = constraintAnnotation.vals(); for (int v : vals) { set.add(v); } } //value 以后要校验的值 @Override public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { return set.contains(value); }}