欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring boot 使用 AOP 处理请求验证

程序员文章站 2022-03-31 11:04:39
...

VO 声明验证

在 VO 中使用 javax.validation.constraints 包提供的验证注解:

	@Data
	public class AnchorRecordVO {
	    @NotNull(message = "基站编号不能为空")
	    private Long num;
	
	    @NotNull(message = "天线编号不能为空")
	    private Integer antId;
	
	    private String site;
	
		...
	}

Controller 中使用 @Valid

在请求参数前使用 @Valid 注解就可以完成验证,验证结果将存放到 BindingResult 中。

	@RequestMapping(value = "/anchors", method = RequestMethod.POST)
    @ResponseBody
    public ResultBean addAnchor(@RequestBody @Valid AnchorRecordVO vo, BindingResult bindingResult) {
        return new ResultBean(anchorService.save(vo));
    }

使用 AOP 统一处理验证异常

声明一个带 BindingResult 参数的切点,并在其中处理验证结果:

	@Aspect
	@Component
	public class ControllerAop {
	
	    private static final Logger logger = LoggerFactory.getLogger(ControllerAop.class);
	
	    @Around("execution(* cn.xxx.xxx.web.controller.*.*(..)) && args(.., bindingResult)")
	    public Object handlerControllerMethodWithValid(ProceedingJoinPoint pjp, BindingResult bindingResult) {
	
	        if (bindingResult.hasErrors()) {
	            ResultBean<?> result = new ResultBean();
	
	            String messages = bindingResult.getAllErrors()
	                    .stream()
	                    .map(ObjectError::getDefaultMessage)
	                    .reduce((m1, m2) -> m1 + "," + m2)
	                    .orElse("参数输入有误");
	            result.setMsg(messages);
	            result.setCode(FAIL);
	
	            return result;
	        } else {
	            return handlerControllerMethod(pjp);
	        }
	    }
	    ...
    }