以上代码 , 会对一个bean进行校验 , 一旦失败 , 就会抛出ValidationException 。
接下来定义一个注解:
/** * facade接口注解 , 用于统一对facade进行参数校验及异常捕获 * <pre> * 注意 , 使用该注解需要注意 , 该方法的返回值必须是BaseResponse的子类 * </pre> */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Facade {}
这个注解里面没有任何参数 , 只用于标注那些方法要进行参数校验 。
接下来定义切面:
/** * Facade的切面处理类 , 统一统计进行参数校验及异常捕获 * @author Hollis */@Aspect@Componentpublic class FacadeAspect { private static final Logger LOGGER = LoggerFactory.getLogger(FacadeAspect.class); @Autowired HttpServletRequest request; @Around("@annotation(com.hollis.annotation.Facade)") public Object facade(ProceedingJoinPoint pjp) throws Exception { Method method = ((MethodSignature)pjp.getSignature()).getMethod(); Object[] args = pjp.getArgs(); Class returnType = ((MethodSignature)pjp.getSignature()).getMethod().getReturnType(); //循环遍历所有参数 , 进行参数校验 for (Object parameter : args) { try { BeanValidator.validateObject(parameter); } catch (ValidationException e) { return getFailedResponse(returnType, e); } } try { // 目标方法执行 Object response = pjp.proceed(); return response; } catch (Throwable throwable) { return getFailedResponse(returnType, throwable); } } /** * 定义并返回一个通用的失败响应 */ private Object getFailedResponse(Class returnType, Throwable throwable) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //如果返回值的类型为BaseResponse 的子类 , 则创建一个通用的失败响应 if (returnType.getDeclaredConstructor().newInstance() instanceof BaseResponse) { BaseResponse response = (BaseResponse)returnType.getDeclaredConstructor().newInstance(); response.setSuccess(false); response.setResponseMessage(throwable.toString()); response.setResponseCode(GlobalConstant.BIZ_ERROR); return response; } LOGGER.error( "failed to getFailedResponse , returnType (" + returnType + ") is not instanceof BaseResponse"); return null; }}
以上代码 , 和前面的切面有点类似 , 主要是定义了一个切面 , 会对所有标注@Facade的方法进行统一处理 , 即在开始方法调用前进行参数校验 , 一旦校验失败 , 则返回一个固定的失败的Response 。
推荐阅读
- 5种茶香5种等级,5种茶绝对不能喝
- macOS 下自定义 应用 app的语言
- 常练太极的人 身体绝对逆天
- 硬盘 几行命令清除移动硬盘GPT保护分区亲测绝对有效
- 小程序自定义动态Tabbar导航栏
- Ingress-nginx自定义配置文件
- 喝茶有5种饮食禁忌,5种茶绝对不能喝
- 利用AOP自定义Redis缓存注解
- 喝茶绝对不能不讲究,喝茶早晚有讲究
- 绝对不要喝的八种茶,禁忌八种不能喝的茶