NutzCN Logo
问答 自定义注解未生效怎么解决
发布于 617天前 作者 qq_64f81159 2348 次浏览 复制 上一个帖子 下一个帖子
标签:

我配置了一个自定义注解, 在我本机加上注解的类会被拦截,可是部署到服务器上就不能生效,感觉像方法未被拦截一样?
注解是这样的

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ContentStatic {

    /**
     * 是否静态化
     * 
     * @return
     */
    boolean isStatic() default true;

    /**
     * 是否异步执行,默认为true
     * 
     * @return true,如果需要异步执行
     */
    boolean async() default true;
}

注解的配置类是这样的

public class ContentStaticAopConfigration
        extends SimpleAopMaker<ContentStatic> {
    private static final Log log = Logs.get();

    @Override
    public List<? extends MethodInterceptor> makeIt(ContentStatic contentStatic,
            Method method, Ioc ioc) {
        log.error("---ContentStaticAopConfigration init---");
        return Arrays.asList(
                new ContentStaticAopInterceptor(ioc, contentStatic, method));
    }

}

这个方法加载是配置在dao.json中
$aop_scontent : {
type : "com.xxx.aop.ContentStaticAopConfigration"
}

拦截器操作类是

public class ContentStaticAopInterceptor implements MethodInterceptor {
    private static final Log log = Logs.get();

    protected Ioc ioc;
    protected SiteService siteService;
    protected boolean isStatic;
    protected boolean async;

    public ContentStaticAopInterceptor(Ioc ioc, ContentStatic contentStatic,
            Method method) {
        this.ioc = ioc;
        isStatic = contentStatic.isStatic();
        async = contentStatic.async();
    }

    @Override
    public void filter(InterceptorChain chain) throws Throwable {
        try {
            chain.doChain();
        }
        catch (Throwable e) {
            log.error(e);
            throw e;
        }
        finally {
            doStatic(chain, null);
        }
    }

    protected void doStatic(InterceptorChain chain, Throwable e)
            throws InterruptedException {
        if (siteService == null) {
            siteService = ioc.get(SiteService.class);
        }
        try {
            log.errorf("---doStatic begin---");
            siteService.aopStaticMainSite(async);
            log.errorf("---doStatic end---");
        }
        catch (Exception e1) {
            log.error("contentStatic fail", e1);
        }
    }

}

还有个奇怪的问题是 log.error("---ContentStaticAopConfigration init---");这句话会被打印多次,难道不该在dao.json实例化吗?我以为服务器启动就会打印,结果是第一次请求了上面那个打印才生成,而且是打印多次

11 回复

当ioc bean实例化的时候, 才会触发aop, 然后NutIoc的所有ioc bean都是懒加载, 第一次使用的时候才会初始化

makeIt是对应一个个方法的, 每个方法对应一个aop拦截器列表. 有多少个被aop拦截的方法, 就会调用多少次makeIt

嗯,开始有点搞错了,因为是仿造slog写的,所以以为这个Configration是配置类,但是有个关键是为啥在服务器上自定义注解没有生效,另外如果定义两个注解,这两个注解要有先后顺序,怎么办呢?

$aop_xxx 是按自然顺序排序的,调整不同的名字就能区分前后顺序

喔 我上面那个写法是没有问题的把 关键现在服务器上完全没有反应,我本机怎么测都是好的,拦截方法完全没有进入,打印都没有。

是不是dao.json没加载?或者日志级别不对,所以看不出来?

不会啊 slog用着挺好 服务器上也可以使用,就是这个自定义的不行

日志里面ContentStaticAopConfigration也没出来?

没有打印出来,就是这个没有打印出来 我在MainModule中直接写类名也不行 前面加了*好,本地可以 就是服务器死活不行

  "*com.xxx.aop.ContentStaticAopConfigration" })

那就是dao.json没生效咯/没更新咯

真是奇怪,我换一台机器又好了,那台测试机死活不行,代码是一样的。

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