关于springboot使用注解来完成参数校验这部分内容,只是写了一个标题,然后找了点注解就这么贴在了上边,那么现在博主来完成这一篇博客。
首先我们来说一下我们要实现的效果是什么?
我们要实现的效果就是在只使用注解的情况下一劳永逸的完成参数的校验,比如:判空、字符串长度、邮箱、手机号的校验等等。
当然在能够只是用注解完成参数校验之前,我们还是需要做一些前期工作的。
1.创建VO并添加注解
package com.youyou.learn.vo; import com.youyou.learn.validation.PhoneRegex; import lombok.Data; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; @Data public class UserVO { @NotNull(message = "名字不能为空") private String name ; @Min(value = 18, message = "年龄必须大于18") private Integer age; }2.在controller中添加注解@Validated
package com.youyou.learn.controller; import com.youyou.learn.TestValidateService; import com.youyou.learn.vo.UserVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.constraints.NotNull; import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; @RestController @RequestMapping(value = "/api/validated") @Api(description = "测试校验") public class TestValidatedController { @Autowired private TestValidateService testValidateService; @ApiOperation(value = "test1") @GetMapping(value = "/test1" ) public void test(@Validated UserVO userVO){ } }3.创建一个异常处理器,这个异常处理器很关键,如果没有这个异常处理器,系统将直接将异常抛出,并不会返回校验结果
package com.youyou.common.advice; import com.youyou.common.http.ResponseMessage; import com.youyou.common.http.ResponseMessageErrorCodeEnum; import com.youyou.common.http.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.validation.BindException; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import java.util.ArrayList; import java.util.List; /** * 异常处理类 */ @ControllerAdvice @Slf4j public class WorldBaseExceptionAdvice { /** * 处理BindException * * @param exception * @return */ @ResponseStatus(HttpStatus.OK) @ExceptionHandler(BindException.class) @ResponseBody public ResponseMessage handlerBindException(BindException exception) { log.warn(exception.getMessage(), exception); List<ObjectError> allErrors = exception.getBindingResult().getAllErrors(); List<String> errors = new ArrayList<>(); for (ObjectError allError : allErrors) { errors.add(allError.getDefaultMessage()); } return Result.error(ResponseMessageErrorCodeEnum.ERROR.getCode(), errors.toString()); } /** * 处理Exception * * @param exception * @return */ @ResponseStatus(HttpStatus.OK) @ExceptionHandler(Exception.class) @ResponseBody public ResponseMessage handlerAdcDaBaseException(Exception exception) { log.error(exception.getMessage(), exception); return Result.error(ResponseMessageErrorCodeEnum.ERROR.getCode(), "程序异常,请重试。如果重复出现请联系管理员处理!"); } }PS:代码中保存了一些博主的个人代码,同学们稍微改一改,换成自己的代码即可。
到此使用参数校验的工作就完成了。测试效果如下:
下面是自带注解的一些内容和说明
@Null 只能是null @NotNull 不能为null 注意用在基本类型上无效,基本类型有默认初始值 @AssertFalse 必须为false @AssertTrue 必须是true 字符串/数组/集合检查:(字符串本身就是个数组) @Pattern(regexp="reg") 验证字符串满足正则 @Size(max, min) 验证字符串、数组、集合长度范围 @NotEmpty 验证字符串不为空或者null @NotBlank 验证字符串不为null或者trim()后不为空 数值检查:同时能验证一个字符串是否是满足限制的数字的字符串 @Max 规定值得上限int @Min 规定值得下限 @DecimalMax("10.8") 以传入字符串构建一个BigDecimal,规定值要小于这个值 @DecimalMin 可以用来限制浮点数大小 @Digits(int1, int2) 限制一个小数,整数精度小于int1;小数部分精度小于int2 @Digits 无参数,验证字符串是否合法 @Range(min=long1,max=long2) 检查数字是否在范围之间 这些都包括边界值
日期检查:Date/Calendar @Post 限定一个日期,日期必须是过去的日期 @Future 限定一个日期,日期必须是未来的日期 其他验证: @Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验 @Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过 @URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法URL