最近在写项目的时候,在每一个controller都充满了大量的if来校验参数,而且每一个controller还不同,不能把校验的方法封装起来.特别麻烦,想了半天.有一个Java自带的参数校验,只要在对应的dto上面加上注解.绑定message,然后配合Spring的BindingResult result来获取返回信息,这样就可以较为友善的返回前台了.
javax.validation.constraints
废话不多说,直接上代码.
用拦截器也能实现类似的效果
@Aspect
@Component
public class ParamValidAspect
{
private static final Logger log = LoggerFactory.getLogger(ParamValidAspect.class);
@Around("@annotation(checkParamIsValid)")
public Object CheckParamIsValid(ProceedingJoinPoint point, CheckParamIsValid checkParamIsValid) throws Throwable
{
Object[] paramObj = point.getArgs();
if (paramObj.length > 0)
{
if (paramObj[1] instanceof BindingResult)
{
BindingResult result = (BindingResult) paramObj[1];
ResponseResult errorMap = this.validRequestParams(result);
if (errorMap != null)
{
ServletRequestAttributes res = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = res.getResponse();
response.setContentType("application/json;charset=UTF-8");
//这里可以设置响应的状态
//response.setStatus(HttpStatus.BAD_REQUEST.value());
response.setStatus(HttpStatus.OK.value());
OutputStream output = null;
try
{
output = response.getOutputStream();
String error = new Gson().toJson(errorMap);
log.info("aop 检测到参数不规范" + error);
output.write(error.getBytes("UTF-8"));
output.flush();
} catch (IOException e)
{
log.error(e.getMessage());
} finally
{
try
{
if (output != null)
{
output.close();
}
} catch (IOException e)
{
log.error(e.getMessage());
}
}
}
}
// 如果校验不通过,也通过response响应了信息.直接返回空,不执行方法即可
return null;
}
else
{
return point.proceed();
}
}
/**
* 校验
*/
private ResponseResult validRequestParams(BindingResult result)
{
if (result.hasErrors())
{
List<ObjectError> allErrors = result.getAllErrors();
List<String> lists = new ArrayList<>();
for (ObjectError objectError : allErrors)
{
lists.add(objectError.getDefaultMessage());
}
return new ResponseResult<>().error(HttpStatus.BAD_REQUEST.value(), "传递参数有问题哦");
}
return null;
}
}
附上注解
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式