自定义注解!绝对是程序员装X的利器( 四 )

以上代码 , 会对一个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 。


推荐阅读