使用springboot整合hibernate-validator校验表单

  1. 在日常开发中,需要对前端提交的表单进行参数校验,甚至是参数的多层次校验。
  2. 导包
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>
  1. 校验实体与控制器如下
public class Student {

    @NotNull(message = "id不能为空")
    private Long id;
    @NotBlank(message = "姓名不能为空")
    private String name;
    @Valid 	//添加这个注解就可以嵌套校验
    @NotEmpty(message = "请填写爱好") //校验集合不为空
    @Size(max = 2, message = "爱好不能超过{max}个") 
    private List<Hobby> hobbies;
	...
	}
public class Hobby {

    private Long id;
    @NotBlank(message = "请填写爱好")
    private String like;
    ...
	}
	
@Validated
@RestController
public class DemoController {

    /**
     * post请求校验参数 参数中添加@Validated注解
     * @param student
     * @return
     */
    @PostMapping("/post")
    public JSONResult post(@RequestBody @Validated Student student) {
        System.out.println(student);
        return JSONResult.success(student);
    }

    /**
     * get请求校验参数 controller上添加 @Validated注解
     * @author luo jiang
     * @date 2021/1/26
     * @param id 
     */
    @GetMapping("/get")
    public JSONResult get(@NotNull(message = "id不能为空") Long id) {
        System.out.println(id);
        return JSONResult.success(id);
    }



}
    
  1. 配置全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 校验异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(UnexpectedTypeException.class)
    @ResponseBody
    public JSONResult validationException(UnexpectedTypeException e) {
        logger.error("参数校验异常:", e);
        return JSONResult.failure(e.getMessage());
    }

    /**
     * Hibernate Validator参数校验异常处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public JSONResult handler(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        ObjectError objectError = bindingResult.getAllErrors().get(0);
        return JSONResult.failure(-1, objectError.getDefaultMessage());
    }
    /**
     * 未被关注的异常信息,统一返回给客户端为“系统异常”
     *
     * @param e
     * @param response
     * @param request
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public JSONResult exceptionHandler(Exception e, HttpServletResponse response, HttpServletRequest request) {
        return JSONResult.failure(-1, "系统异常");
    }


}
  1. 分组校验
  • 新建两个校验组 和校验类
/**
 *功能描述 草稿分组校验
 * @author luo jiang
 * @date 2021/1/26
 */
public interface DraftGroup {
}

/**
 * 功能描述 保存分组校验
 * @author luo jiang
 * @date 2021/1/26
 */
public interface SaveGroup {
}

public class Tenant {

    @NotNull(message = "id不能为空", groups = {SaveGroup.class})
    private Long id;

    @Length(max = 5, message = "名称不能超过{max}个字符", groups = {DraftGroup.class, SaveGroup.class})
    private String name;

    @Length(max = 5, message = "简介不能超过{max}个字符", groups = {SaveGroup.class})
    private String intro;
	// SaveGroup校验所有参数  DraftGroup校验 name 
    ...
}
 /**
     * 功能描述 分组校验 @Validated指定校验组
     * @author luo jiang
     * @date 2021/1/26
     * @param tenant
     * @return com.luojiang.validator.util.JSONResult
     */
    @PostMapping("/saveGroup")
    public JSONResult saveGroup(@RequestBody @Validated(SaveGroup.class) Tenant tenant) {
        System.out.println(tenant);
        return JSONResult.success(tenant);
    }

    /**
     * 功能描述 分组校验 @Validated指定校验组
     * @author luo jiang
     * @date 2021/1/26
     * @param tenant
     * @return com.luojiang.validator.util.JSONResult
     */
    @PostMapping("/draftGroup")
    public JSONResult draftGroup(@RequestBody @Validated(DraftGroup.class) Tenant tenant) {
        System.out.println(tenant);
        return JSONResult.success(tenant);
    }


校验结果
SaveGroup
在这里插入图片描述
DraftGroup
在这里插入图片描述
项目地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值