JSR303 参数校验

JSR303是什么
JSR303是一套JavaBean参数校验的标准,定义了很多常用的校验注解
可以直接将这些注解加在我们JavaBean的属性上面就可以在需要校验的时候进行校验了

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

简单的数据效验
我们可以使用javax.validation.constraints包中提供的注解,给实体类字段添加规则。
在这里插入图片描述

1、给实体类添加验证规则

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

	@TableId
	private Long brandId;

	//约束name不能为null,且至少有一个非空字符
	@NotBlank(message = "品牌名必须提交")
	private String name;

	@NotBlank(message = "logo不能为空")
	//URL是hibernate提供的注解,实现了JSR303规范。约束如果logo不为null的话,必须符合url格式
	@URL(message = "logo格式不符")		
	private String logo;

	private String descript;

//	@Pattern(regexp = "[0-1]")		//pattern不支持Integer
	private Integer showStatus;

	//使用正则表达式约束字段
	@Pattern(regexp = "^[a-zA-Z]$" , message = "首字母必须是一个字母")
	private String firstLetter;

	@Min(value = 0 , message = "排序字段必须大于等于0")
	private Integer sort;
}

2、controller层使用@Valid开启验证功能

@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand){
	brandService.save(brand);

    return R.ok();
}

使用BindingResult处理异常
在上例中,虽然我们完成了数据验证,但是返回给前端的数据并不友好。在项目中应该返回一个统一的结果。
使用BindingResult得到接受参数效验的结果

  @RequestMapping("/save")
    //@RequiresPermissions("product:brand:save")
    public R save(@Valid @RequestBody BrandEntity brand, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            //1.出现参数非法情况
            Map<String, String> map = new HashMap<>();
            bindingResult.getFieldErrors().forEach(fieldError -> {
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            });
            return R.error(400, "提交的数据不合法").put("data", map);
        } else {
            //2.参数验证通过, 执行正常逻辑
            brandService.save(brand);
            return R.ok();
        }
    }

使用全局异常

@Slf4j
@RestControllerAdvice(basePackages = "com.p.gulimall.pms.controller")
public class ExceptionController {
    //使用全局异常处理,jsr303校验不符合报错异常
    @ExceptionHandler(Exception.class)
    public R exception(/*通过Exception e得到MethodArgumentNotValidException*/MethodArgumentNotValidException e){
        log.error("数据异常类型:"+e.getClass());//数据异常类型:class org.springframework.web.bind.MethodArgumentNotValidException
        System.out.println(e.getMessage());
        Map<String,String> map=new HashMap<>();
        BindingResult bindingResult = e.getBindingResult();//获取BindingResult效验的结果
        bindingResult.getFieldErrors().forEach(itme->{

            String defaultMessage = itme.getDefaultMessage();
            String field = itme.getField();

            map.put(field,defaultMessage);
        });

        return R.error(400,"数据不合法");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值