前言
接触springboot一年多,是时候摆脱这种校验方式了233 ,每个参数都if判断,一眼看过去就是很low的程序员。
Validation有了这个插件就再也不用这样去校验参数了,可以让我们在项目中不用浪费很多时间在参数校验这里,从而更专注于业务逻辑
正文
首先引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
这里创建一个用户的DTO对象
@Data @ApiModel("用户-表单对象") public class SportsUserCreatForm{ @ApiModelProperty(value="用户唯一标识",example = "0") @NotNull(groups = {Update.class}) private long id; @ApiModelProperty(value = "所属机构唯一标识(冗余字段)", example = "0") private long organizationId; @ApiModelProperty("登录用户名") @NotBlank(message = "用户名不能为空") @Length(max = 10, message = "用户名最长为10位") private String loginName; @ApiModelProperty("密码") private String password; @ApiModelProperty("手机号") private String phone; @ApiModelProperty("邮箱") private String email; @ApiModelProperty("性别( 'MALE', 'FEMALE' )") @NotNull(message = "用户性别不能为空") private SportsUserEnumGender gander; @ApiModelProperty(value = "出生日期-13位时间戳",example = "0") private long birthday; @ApiModelProperty("身份证号") private String idNumber; @ApiModelProperty("用户昵称") private String nickname; }
在controller层添加@Validated注解,添加注解之后spring就会逐个校验DTO中加了校验注解的字段,完全通过才可以进入业务处理,否则就会抛出MethodArgumentNotValidException异常
@PostMapping("user/add") @RequiresAuthentication @ApiOperation("添加用户") public SportsUser addUser(@Validated @RequestBody SportsUserCreatForm user) throws Exception{ return userBiz.addUser(user); }
一般项目来说抛出异常都会有约定好的JSON格式返回错误码和错误信息,如果不处理就无法按照约定格式返回。这里我们可以通过声明全局异常处理类来拦截异常并将异常处理成前端能操作的JSON数据。(这里只需要关注MethodArgumentNotValidException异常)
@Slf4j @Order(Ordered.HIGHEST_PRECEDENCE) @RestControllerAdvice public class GlobalExceptionAdvice { @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ResponseEntity<Object> handleBeanValidation(HttpServletResponse res, MethodArgumentNotValidException e) throws Exception{ res.setStatus(HttpStatus.OK.value()); List<ObjectError> errors = e.getBindingResult().getAllErrors(); ObjectError error = errors.get(0);// 如果有多个异常,这里只取第一个异常。没有必要把所有异常都抛出(错就是错,第一个校验都没通过,自然也轮不到第二个校验。) String json = JsonUtils.obj2json(error); Map map = JsonUtils.json2map(json); OkMessage result = new OkMessage(); result.setMsg("请求参数错误"e.getBindingResult().getFieldError().getDefaultMessage() + "]"); result.setCode("PARAM-000001"); return new ResponseEntity<>(result, HttpStatus.OK); } }
分组校验
有的人就要发问了,"啊,你这校验不行啊,我在添加的时候id是自动生成的不需要校验,编辑的时候就需要校验id了,我是不是要建两个一模一样的DTO,这样岂不是显得我很憨?!这不是增加无用代码吗?差评!"
其实不然,在此我们可以用到 groups 属性来解决此场景下的问题。
声明分组
注意:在声明分组的时候尽量继承 extend javax.validation.groups.Default。 否则,在你声明@Validated(Update.class)的时候,就会出现你在默认没添加groups = {}的时候的校验组@Email(message = "邮箱格式不对")不会自动校验,因为默认的校验组是groups = {Default.class}。
import javax.validation.groups.Default; /** * 数据新增分组 */ public interface Create extends Default { }
import javax.validation.groups.Default; /** * 数据更新分组 */ public interface Update extends Default { }
修改Controller中的@Validated注解,声明校验分组(下面用的是Create.class所以并不会校验id)
@PostMapping("user/add") @RequiresAuthentication @ApiOperation("添加用户") public SportsUser addUser(@Validated(Create.class) @RequestBody SportsUserCreatForm user) throws Exception{ return userBiz.addUser(user); }
下面附上注解说明
此处只列出Hibernate Validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义。
常用的几个: 1.@NotNull:不能为null,但可以为empty(""," "," ") 2.@NotEmpty:不能为null,而且长度必须大于0 (" "," ") 3.@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0("test") 即:必须有实际字符
总结
到此这篇关于Spring boot validation校验的文章就介绍到这了,更多相关Springboot validation校验内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!