日常开发中,前端会对请求参数进行校验,为了保证请求参数的格式正确,也需要在服务端做参数校验。
服务端参数校验用的是Hibernate-validator框架,利用简单注解实现。
实体类增加校验注解
这里以登录为例进行说明:
public class LoginDto {
@NotNull
private String username;//账号
@NotNull
@Length(min = 6, message = "密码格式错误")
private String password;//密码
//set get省略
}
这一块用的注解来实现,比较简单,具体注解的使用说明如下:
| @Null | 被注释的元素必须为 null |
| @NotNull | 被注释的元素必须不为 null |
| @AssertTrue | 被注释的元素必须为 true |
| @AssertFalse | 被注释的元素必须为 false |
| @Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
| @Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
| @Past | 被注释的元素必须是一个过去的日期 |
| @Future | 被注释的元素必须是一个将来的日期 |
| @Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
2. Hibernate Validator 附加的 constraint
| @Email | 被注释的元素必须是电子邮箱地址 |
| @Length(min=, max=)
| 被注释的字符串的大小必须在指定的范围内 |
| @NotEmpty | 被注释的字符串的必须非空 |
| @Range(min=, max=) | 被注释的元素必须在合适的范围内 |
| @NotBlank|被注释的字符串的必须非空|
controller增加@valid注解
在需要校验的请求controller方法中,增加@valid注解,校验要获取的对象字段,如下图:
在controllerAdvice中增加参数校验异常的统一拦截
/**
* 拦截@Valid请求参数验证不通过的异常
*
* @param request request
* @param response response
* @param exception 验证不通过的异常
* @return 执行结果
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
@Order(0)
public JsonResult handler(HttpServletRequest request, HttpServletResponse response, MethodArgumentNotValidException exception) {
logger.info("请求的参数不正确", exception);
logException(request);
String validation_message;
BindingResult bindingResult = exception.getBindingResult();
if (bindingResult != null && bindingResult.getFieldError() != null) {
validation_message = bindingResult.getFieldError().getDefaultMessage();
} else {
validation_message = exception.getMessage();
}
logger.info("参数错误信息:" + validation_message);
return new JsonResult(false, GlobalReturnCode.PARAM_ERROR, validation_message);
}
这里有个@Order(0)注解,参数校验首先进行做,后续再做默认系统异常拦截。比如校验失败提示如下图: