这篇文章主要为大家展示了弹簧引导如何用JSR303实现参数验证,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。
jsr - 303是JAVA EE 6中的一项子规范,叫做Bean验证。
在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定。
Bean验证为JavaBean验证定义了相应的元数据模型和API。缺省的元数据是JAVA注释,通过使用XML可以对原有的元数据信息进行覆盖和扩展。在应用程序中,通过使用Bean验证或是你自己定义的约束,例如@NotNull, @Max, @ZipCode,就可以确保数据模型(对象)的正确性.constraint可以附加到字段,getter方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的constraint.Bean验证是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。
<强> Bean验证规范内嵌的约束注解强>
<>强基本应用强>
引入依赖
& lt; dependency> & lt; groupId> org.springframework.boot & lt; artifactId> spring-boot-starter-validation & lt;/dependency>
给参数对象添加校验注解
@ data 公开课用户{ 私人整数id; @NotBlank(消息=坝没荒芪铡? 私人字符串的用户名; @Pattern (regexp=癪(及# 63;![0 - 9]+ $)(及# 63;! [a-zA-Z] + $) [0-9A-Za-z]{8, 16}“美元,消息=懊苈氡匦胛? ~ 16个字母和数字组合“) 私人密码字符串; 私人字符串邮件; 私人整数性别; }
控制器中需要校验的参数豆前添加@Valid开启校验功能,紧跟在校验的Bean后添加一个BindingResult, BindingResult封装了前面豆的校验结果。
@RestController @RequestMapping (“/user") 公开课用户控件{ @PostMapping (“”) 公共结果保存(@Valid用户用户,BindingResult BindingResult) { 如果(bindingResult.hasErrors ()) { String> Map<字符串;地图=new HashMap<在(); bindingResult.getFieldErrors ()。forEach((项)→{ 字符串消息=item.getDefaultMessage (); 字符串字段=item.getField (); 地图。把(字段、消息); }); 返回的结果。构建(400年,“非法参数!“地图); } 返回Result.ok (); } }
测试如下:
<强>异常的统一处理强>
参数校验不通过时,会抛出BingBindException异常,可以在统一异常处理中,做统一处理,这样就不用在每个需要参数校验的地方都用BindingResult获取校验结果了。
@Slf4j @RestControllerAdvice (basePackages=癱om.itwolfed.controller") 公开课GlobalExceptionControllerAdvice { @ExceptionHandler (value=https://www.yisu.com/zixun/{MethodArgumentNotValidException.class, BindException.class}) 公共结果handleVaildException(异常e) { BindingResult BindingResult=零; 如果(e instanceof MethodArgumentNotValidException) { bindingResult=((MethodArgumentNotValidException) e) .getBindingResult (); }else if (e instanceof BindException) { bindingResult=((BindException) e) .getBindingResult (); } MaperrorMap=new HashMap <> (16); bindingResult.getFieldErrors () .forEach ((fieldError) -> fieldError.getDefaultMessage errorMap.put (fieldError.getField () () ); 返回的结果。构建(400,“非法参数!”,errorMap); } }
<>强分组解决校验强>
新增和修改对于实体的校验规则是不同的,例如id是自增的时候,新增时身份证要为空,修改则必须不为空;新增和修改,若用的恰好又是同一种实体,那就需要用到分组校验。
校验注解都有一个组属性,可以将校验注解分组,我们看下@NotNull的源码: