NutzCN Logo
精华 [问题]关于AOP功能的问题,请求帮助~
发布于 2884天前 作者 qq_3c2e5aa9 1631 次浏览 复制 上一个帖子 下一个帖子
标签:

项目全部采用AJAX + JSON的方式请求与响应。对controller层做集中的异常、错误处理。

避免由于controller层出现未捕捉的异常、错误,所导致的前端页面的请求没有反馈,因此使用AOP方式拦截所有controller方法的执行情况,方法出现异常则直接使用Response向客户端写出错误JSON信息。但现在出现一个问题,就是当controller入口方法调用本类里其他非静态,非私有方法时,也会被拦截所捕捉。如何才能只对入口方法进行拦截,而不关注入口方法调用的其他方法呢?

aop.js文件


var ioc = {
    controllerInterceptor: {
        type: 'a.b.aop.ControllerInterceptor'
    },
    $aop: {
        type: 'org.nutz.ioc.aop.config.impl.JsonAopConfigration',
        fields: {
            itemList: [
                ["a\\.b\\.business\\.controller\\..+", ".+", "ioc:controllerInterceptor"]
            ]
        }
    }
}

Controller文件


……
@At("/a/admin")
@Ok("json")
public Object adminTest(){
       ……
	   return getSession().getAttribute("qqq");
}

/* 这是个父类里方法 */
protected HttpSession getSession(){}
……

拦截器会对adminTest和父类里的getSession都进行拦截,而只需要对adminTest进行拦截即可。方法名字无法限定,或者可以设置只拦截public方法,希望得到帮助~万分感谢。

6 回复

拦截器里到是可以根据方法的注解和请求的At进行判断,只是不知道这样的拦截对项目请求响应会不会有效率问题。

效率应该不是问题,取注解的成本很低.

另外一种方式就是自定义AopConfigration

方法1, 通过SimpleAopMaker做

@IocBean("$aop_ControllerInterceptor")
public class ControllerInterceptorAopConfigure<At>{

	public List<? extends MethodInterceptor> makeIt(At at, Method method, Ioc ioc) {
		return Arrays.asList(new ControllerInterceptor());
	}

	public String[] getName() {
		return new String[0];
	}
	
	public boolean has(String name) {
		return false;
	}
}

方法2就是直接实现AopConfigure接口了.

问题解决了,是用第一种方法做的。并且重写了checkMethod方法。还有一个不明白的地方,这个扩展的SimpleAopMaker,是将带有注解的方法进行拦截是吗?因为没有设置任何包的配置。

配置文件


"$aop": {
        type: 'a.b.aop.ControllerInterceptorAopConfigure'
}

ControllerInterceptorAopConfigure文件


public class ControllerInterceptorAopConfigure extends SimpleAopMaker {

    @Override
    public List makeIt(At at, Method method, Ioc ioc) {
        return Arrays.asList(ioc.get(ControllerInterceptor.class, "controllerInterceptor"));
    }

    @Override
    public boolean checkMethod(Method method) {
        int mod = method.getModifiers();
        if (mod == 0 || Modifier.isStatic(mod) || Modifier.isPrivate(mod)
                || Modifier.isFinal(mod)
                || Modifier.isAbstract(mod) || **Modifier.isProtected(mod)**)
            return false;
        return true;
    }
}

测试已经没问题了,请帮忙看一下这样是否和您说的意思一样,哪里还需要改进吗?谢谢

把getName和has方法也加上,覆盖原有的.

机制是这样的:

如果一个ioc bean的名字是$aop_开头且类型是AopConfigration,则自动识别为aop配置. 然后, SimpleAopMaker 会读取实现(子)类的泛型,得到需要识别的注解. 接下来就是checkMethod的判断了,如果一个方法带指定注解,就返回true,启用aop化. makeIt方法返回需要注入的aop 拦截器.

好的,谢谢,十分感谢~~

添加回复
请先登陆
回到顶部