简介
springboot-validation 是集成了hibernate-validator框架,针对web端的rest接口提供接口入参校验,能够对字段的长度,是否为空进行校验,还可以根据业务的特殊需求,实现自定义的注解校验。
maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
maven会自动导入需要的hibernate-validator包。
参数校验异常收集类 ValidatorConfiguration.java
通过@ControllerAdvice注解可以实现对spring框架全局异常的捕获。
import com.stock.stockapi.common.JsonResult;
import javax.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author K0171005
* @version 1.0.0
* <ul>
* <li>project : stock</li>
* <li>package : com.stock.stockservice.config</li>
* </ul>
* @since 2019/8/7 16:35
**/
@RestControllerAdvice
@Slf4j
public class ValidatorConfiguration {
@ExceptionHandler(BindException.class)
public JsonResult handleMethodVoArgumentNotValidException(BindException ex) {
FieldError fieldError = ex.getFieldError();
//field.ErrorgetField() 读取参数字段
//field.getDefaultMessage() 读取验证注解中的message值
String message = "参数{".concat(fieldError.getField()).concat("}").concat(fieldError.getDefaultMessage());
log.info("参数校验失败111 {}", message);
JsonResult jsonResult = new JsonResult();
jsonResult.setMsg(message);
// jsonResult.setCode();
return null;
}
@ExceptionHandler(value = ConstraintViolationException.class)
public JsonResult handleMethodArgumentNotValidException(ConstraintViolationException ex) {
log.info("参数校验失败");
return null;
}
}
这里一个有两个异常需要捕获,一个是BindException,一个是ConstraintViolationException,两个都是验证框架抛出的异常,都需要捕获,在捕获了异常之后,封装异常结果,可以获取到是那些字段校验不通过,以及不通过的原因。
@Getter
@Setter
public class QueryStockReqDTO implements Serializable {
/**
* 主键
* notNull 和size注解用来校验参数
*/
@NotNull
@Size(min = 1)
private String id
}
/**
* 在对象前面添加 @Validated 注解,就可以对象内的参数进行校验。
*/
@Override
@GetMapping("/delete")
public JsonResult<Boolean> deleteStock( @Validated DeleteStockDTO deleteStockDTO) throws BaseException {
JsonResult<Boolean> jsonResult = new JsonResult<>();
try {
jsonResult.setCode(SystemConstant.FAIL);
jsonResult.setMsg(SystemConstant.FAIL_MSG);
jsonResult.setData(false);
stockMapper.deleteByPrimaryKey(deleteStockDTO.getId());
} catch (Exception e) {
throw new BaseException(SystemConstant.FAIL, SystemConstant.FAIL_MSG, e);
}
return jsonResult;
}