一、jar包添加下面其中之一即可
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>根据实际情况指定版本号</version></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>根据实际情况指定版本号</version></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
因为springcloud项目已经引入spring-boot-starter-web
二、在实体中增加验证注解
注意下下面的注解中的groups属性作用:当实体用于不同的场景时,在验证时需要加以区分,此时需要用到分组。
如果不需要区分使用场景,可以去掉groups属性。
如本示例中,定义了两个分组Creation, Modification用于区分在新增、修改场景下对属性做不同的数据校验
public class RmRegionEntity extends BaseEntity{private static final long serialVersionUID = -322027541582939044L;@NotBlank(message="区域主键不能为空!", groups = {Creation.class, Modification.class})private String pkRegion; //区域主键@NotNull(message="城市级别不能为空!", groups = {Creation.class, Modification.class})private Integer fcitygrade; //城市级别:5071省级、5072地级、5073县级@NotBlank(message="创建人名称不能为空!", groups = {Creation.class})private String creatorName; //创建人名称@NotBlank(message="修改人名称不能为空!", groups = {Modification.class})private String modifierName; //修改人名称}
三、在Controller中的使用
使用@Valid或@Validated,但当指定分组时需要使用@Validated
下面示例中,因用到分组,所以注解中传入了Creation,表示在数据校验时校验实体中分组为Creation的属性。
如果没用到分组,@Valid或@Validated都可以使用不用传值,直接使用即可
@PostMapping("/v1/insertRmRegion") public ResponseResult<Integer> insertRmRegion(@Validated({Creation.class}) @RequestBody RmRegionEntity rmRegionEntity) {ResponseResult<Integer> result = new ResponseResult<>();Integer count = null;try {count = rmRegionService.insertRmRegion(rmRegionEntity);result.responseSuccess(null, count, "新增数据成功!");}catch(BizException e) {logger.warn("业务异常", e);result.responseBizException(null, null, e.getMessage());}catch(Exception e) {logger.error("新增信息出现异常", e);result.responseException(null, null, e.getMessage());}return result;}
四、分组定义
定义成一个空的接口即可
public interface Creation {}
五、全局异常处理
如果要将校验的错误信息格式化成自己想要的格式,可以通过全局异常进行统一捕捉,然后返回错误信息。
类上增加注解@RestControllerAdvice
@RestControllerAdvicepublic class GlobelExceptionAdvice {private static final Logger logger = LoggerFactory.getLogger(GlobelExceptionAdvice.class);@Autowiredprivate HttpServletRequest httpServletRequest;/*** 参数校验异常** @param exception* @return*/@ExceptionHandler({ MethodArgumentNotValidException.class })public ResponseResult<String> methodArgumentNotValid(MethodArgumentNotValidException exception) {ResponseResult<String> result = new ResponseResult<>();BindingResult bindingResult = exception.getBindingResult();//返回第一个错误的信息String defaultMessage = bindingResult.getFieldError().getDefaultMessage();String code = bindingResult.getFieldError().getCode();String field = bindingResult.getFieldError().getField();result.responseBizException(code, field, defaultMessage);logger.warn("参数验证错误,错误信息: {}, 请求的URL: {}", result, httpServletRequest.getRequestURI());return result;}/*** 参数校验异常** @param exception* @return*/@ExceptionHandler(value = BindException.class)public ResponseResult<String> bindException(BindException exception) {ResponseResult<String> result = new ResponseResult<>();BindingResult bindingResult = exception.getBindingResult();//返回第一个错误的信息String defaultMessage = bindingResult.getFieldError().getDefaultMessage();String code = bindingResult.getFieldError().getCode();String field = bindingResult.getFieldError().getField();result.responseBizException(code, field, defaultMessage);logger.warn("参数验证错误,错误信息: {}, 请求的URL: {}", result, httpServletRequest.getRequestURI());return result;}/*** 数据类型校验异常* @param exception* @return*/@ExceptionHandler(value = UnexpectedTypeException.class)public ResponseResult<String> unexpectedTypeException(UnexpectedTypeException exception) {ResponseResult<String> result = new ResponseResult<>();result.responseBizException(null, exception.getMessage(), "数据类型错误!");logger.warn("参数验证错误,错误信息: {}, 请求的URL: {}", result, httpServletRequest.getRequestURI());return result;}
属性验证注解
参考地址:
/moues/p/11399421.html
/1197822/2467086
/songguopeng/article/details/98961787