第一步:引入依赖
spring-boot-started-web中包含了hibernate-validator,不需要额外引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二步:Post请求参数前增加@Valid注解,Get请求controller类上增加@Validated注解,参数上增加validator校验注解例如:@NotBlank
注意:@Valid在@RequestParam参数无效
@PostMapping("/listDeviceByParams")
public String listDeviceByParams(@RequestBody @Valid ListDeviceByParamsReqVO listDeviceByParamsReqVO) {
return deviceFeign.cameraList(listDeviceByParamsReqVO);
}
@GetMapping("/gateway/getProbeResult")
public String getProbeResult(@RequestParam("productKey") @NotBlank(message = "productKey不能为空") String productKey,
@RequestParam("gatewayId") @NotBlank(message = "gatewayId不能为空") String gatewayId,
@RequestParam("timeStamp") @NotBlank(message = "timeStamp不能为空") String timeStamp) {
return deviceFeign.queryGatewayRealTimeSpeed(productKey, gatewayId, timeStamp);
}
第三步:请求参数bean增加validator注解,增加默认提示消息message
@Data
public class ListDeviceByParamsReqVO {
private Integer page = 0;
private Integer size = 100;
private String projectCard;
@NotNull(message = "productKeys不能为空")
private List<Productkey> productKeys;
@NotNull(message = "gatewayType不能为空")
private Integer gatewayType;
private String gatewayId;
private String searchKey;
private String searchValue;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
第四步:增加统一异常处理类@RestControllerAdvice,捕获参数校验异常MethodArgumentNotValidException并返回
@RestControllerAdvice
@Component
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler
@ResponseBody
public ApiCommonResVO<String> expHandler(Exception e){
log.error("uncaught biz exception:",e);
if (e instanceof MethodArgumentNotValidException){
BindingResult result = ((MethodArgumentNotValidException) e).getBindingResult();
if (result.hasErrors()){
List<ObjectError> errors = result.getAllErrors();
StringBuilder stringBuilder = new StringBuilder(ResCodeEnum.PARAM_VALID_ERROR.getResMessage());
errors.forEach(error -> {
FieldError fieldError = (FieldError) error;
stringBuilder.append(",").append(fieldError.getDefaultMessage());
log.info("参数校验异常,{},{},{}",fieldError.getObjectName(),fieldError.getField(),fieldError.getDefaultMessage());
});
return ApiCommonResVO.fail(ResCodeEnum.PARAM_VALID_ERROR.getResCode(),stringBuilder.toString());
}
} else if (e instanceof ConstraintViolationException){
Set<ConstraintViolation<?>> items = ((ConstraintViolationException) e).getConstraintViolations();
StringBuilder stringBuilder = new StringBuilder(ResCodeEnum.PARAM_VALID_ERROR.getResMessage());
items.forEach( item -> stringBuilder.append(item.getMessage()));
return ApiCommonResVO.fail(ResCodeEnum.PARAM_VALID_ERROR.getResCode(),stringBuilder.toString());
}
return ApiCommonResVO.exception( e.getLocalizedMessage());
}
}
第五步:启动并调用测试,测试成功
image.png
image.png