700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【springboot】springboot validation 参数验证 分组验证及全局统一异常处理

【springboot】springboot validation 参数验证 分组验证及全局统一异常处理

时间:2019-02-11 16:53:25

相关推荐

【springboot】springboot validation 参数验证 分组验证及全局统一异常处理

一、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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。