栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

五、JSR303后端校验及自定义注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

五、JSR303后端校验及自定义注解

一、注解校验 1.注解标在实体类的字段上

@Null @NotNull
可以在注解的括号中定义自己的message提示

@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	
	@Null(message = "新增不能指定ID",groups = {AddGroup.class})
	@NotNull(message = "修改必须指定id",groups = {UpdateGroup.class})
	@TableId
	private Long brandId;
	
	@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})
	private String name;
	
	@NotEmpty(message = "logo不能为空",groups = {AddGroup.class})
	@URL(message = "logo必须是一个合法的url",groups = {AddGroup.class,UpdateGroup.class})
	private String logo;
	
	private String descript;
	
	@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
	@ListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class})
	private Integer showStatus;
	
	@NotEmpty(groups = {AddGroup.class})
	@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母",groups = {AddGroup.class,UpdateGroup.class})
	private String firstLetter;
	
	@NotNull(groups = {AddGroup.class})
	@Min(value = 0,message = "排序必须大于等于0",groups = {AddGroup.class,UpdateGroup.class})
	private Integer sort;

}

2.分组校验


(1)controller接口

 public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){

(2)实体类

@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})

(3)默认没有指定分组的校验注解@NotBlank,在分组校验情况下不生效,只会在@Validated生效

3.开启校验注解功能

@Validated({AddGroup.class}) 可以指定校验的组
@Valid

@RequestMapping("/save")
    public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){
        brandService.save(brand);

        return R.ok();
    }
4.给校验的bean后面紧跟BindingResult

就可以获取到校验的结果

public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){

5.统一的异常处理

@RestControllerAdvice 此注解是统一处理异常的注解
是由ResponseBody ControllerAdvice组合而成的

接下来对异常的信息进行整理组合成返回值

@Slf4j
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleValidException(MethodArgumentNotValidException e){
        log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        HashMap errorMap = new HashMap<>();
        bindingResult.getFieldErrors().forEach((fieldError) -> {
            errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
        });
        return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(),BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data",errorMap);
    }

    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable){
        log.error("错误:",throwable);
        return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(),BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
    }
}
二、自定义注解 1.先声明一个自定义注解 接口

@Documented
@Constraint(validatedBy = { ListValueContraintValidator.class }) //指定一下使用哪个校验器
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
    String message() default "{com.atguigu.valid.ListValue.message}";

    Class[] groups() default { };

    Class[] payload() default { };

    int[] vals() default {
    };
}

2.编写自定义注解的校验器
//校验器
public class ListValueContraintValidator implements ConstraintValidator {
    private Set set = new HashSet<>();
    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();
        for (int val : vals) {
            set.add(val);
        }
    }


    //判断是否校验成功

    
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return set.contains(value);
    }
}

3.将自定义注解和自定义注解联系起来

4.自定义注解的message提示信息(写在resource目录下)

5.自定义注解的使用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024936.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号