关于java:java校验功能的使用

32次阅读

共计 3078 个字符,预计需要花费 8 分钟才能阅读完成。

JSR303 校验的应用步骤

  1. 给 Bean 增加校验注解:javax.validation.contrains, 并定义本人的 message 提示信息
  2. 开启校验性能,在具体的办法参数中增加 @Valid; 这样校验出错是会有默认的谬误响应信息
  3. 给校验的 bean 前面紧跟一个 BindingResult 参数,就能够获取到校验的后果
  4. 分组校验(实现多场景的简单校验)
    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 进行对立的异样解决

  • 应用步骤
  1. 编写异样解决类,并在类上增加 @ControllerAdvice
  2. 在类中增加异样解决的办法,并在办法上增加 @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);
 }
}

正文完
 0