以下内容纯属个人扯淡,仅供参考
目录
《Spring实战》给出的参数校验方式
参考:《Spring实战》知识点总结 搜索:表单校验
大致思路:在需要被校验的实体类的属性上添加校验注解;在POST方法该实体类前添加@Valid注解,并紧随添加一个Errors errors形参;在该方法体errors.hasErrors()是否校验通过来控制
使用SpringAOP改进
1、实体类属性添加校验注解
@Data
public class PctUserParam {
@NotEmpty(message = "用户名不能为空")
private String username;
private String password;
@Email
private String mail;
private Integer status;
/**
* 备注
*/
private String remark;
}
2、控制器方法
@PostMapping("user")
public CommonResult<Boolean> addUser(
@RequestBody @Validated PctUserParam pctUserParam,
BindingResult bindingResult) {
return pctUserService.addUser(pctUserParam);
}
用@Validated替换了@Valid,并且Errors替换为BindingResult
3、AOP拦截处理
@Aspect
@Component
@Order(2)
@Slf4j
public class BindingResultAspect {
/**
* 定义切入点
*
**/
@Pointcut("execution(public * com.controller.*.*(..))")
public void bindingResult() {
}
/**
* 环绕通知
*
* @date 10:54 2020/3/20
* @author 李文龙
* @param
* @return
**/
@Around("bindingResult()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//获取方法的所有形参
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
//拿到参数校验结果形参
if (arg instanceof BindingResult) {
BindingResult result = (BindingResult) arg;
if (result.hasErrors()) { //校验失败
FieldError fieldError = result.getFieldError();
if(fieldError!=null){
log.error("fieldError="+fieldError.getDefaultMessage());
return CommonResult.validateFailed(fieldError.getDefaultMessage());
}else{
return CommonResult.validateFailed();
}
}
}
}
//正常执行方法
return joinPoint.proceed();
}
}
使用全局异常处理器实现
将参数校验层完全抽离
自定义注解
service层参数校验设计