NutzCN Logo
问答 关于在拦截器中,dao为null的问题
发布于 2384天前 作者 qq_7fafbecc 2976 次浏览 复制 上一个帖子 下一个帖子
标签:

意图:写一个方法拦截器,在方法执行的同时,把用户执行的操作事件记录下来(操作人,操作时间,哪种业务.....)
问题:注入的dao是null,无法执行insert操作

import org.nutz.aop.InterceptorChain;
import org.nutz.aop.MethodInterceptor;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;

@IocBean
public class EventLogInterceptor implements MethodInterceptor {

	@Inject    //AnnotationIocLoader根据这个注解来了解类中的字段,具体的注入方式
    protected Dao dao;
	
	@Override
	public void filter(InterceptorChain chain) throws Throwable {
		// TODO Auto-generated method stub
		
		String ServiceName = chain.getCallingObj().getClass().getName();
		int loc = ServiceName.indexOf("$");//首先获取字符的位置
		ServiceName = ServiceName.substring(0,loc);//再对字符串进行截取,获得想要得到的字符串
		String ServiceMethodName = chain.getCallingMethod().getName();
		System.out.println("================拦截器中,进行事件记录,向后台事件表写入记录:==============>");
		Sql sql = Sqls.create("insert into BLOOD_SYS_EVENT values ('0001','0002')");
		dao.execute(sql);
		chain.doChain();
	}

}
12 回复

为什么在别的业务类中,dao注入进去,却不为空?

EventLogInterceptor是通过何种方式配置到aop的?

通过@EventLog注解

public class AopLoader2 extends SimpleAopMaker<EventLog>{

	@Override
	public List<? extends MethodInterceptor> makeIt(EventLog t, Method method, Ioc ioc) {
		// TODO Auto-generated method stub
		return Arrays.asList(new EventLogInterceptor());
	}
}
new EventLogInterceptor()

直接new的对象,又怎么会有注入一说呢?

得@Inject进来,或者从ioc容器取才可以

这样吗?

public class AopLoader2 extends SimpleAopMaker<EventLog>{
	
	@Inject    
    protected EventLogInterceptor eventLogInterceptor; 
	
	@Override
	public List<? extends MethodInterceptor> makeIt(EventLog t, Method method, Ioc ioc) {
		// TODO Auto-generated method stub
		return Arrays.asList(this.eventLogInterceptor);
	}
}

加@Inject的先决条件是什么呢? 想一想?

给个例子供参考, 确保@IocBy能扫描到它就行

@IocBean(name="$aop_syslog")
public class SLogAopConfigration extends SimpleAopMaker<SLog> {

    @Inject
    protected SLogAopInterceptor slogMethodInterceptor;

    public List<? extends MethodInterceptor> makeIt(SLog slog, Method method, Ioc ioc) {
        return Arrays.asList(slogMethodInterceptor);
    }

    public String[] getName() {
        return new String[0];
    }

    public boolean has(String name) {
        return false;
    }
}

1、刚才只加@IocBean,不是加的@IocBean(name="$aop_syslog")
结果报错了
严重: Exception starting filter nutz
org.nutz.mvc.LoadingException: org.nutz.lang.born.BorningException: Fail to born 'com.shlx.blood.aop.AopLoader2' because: org.nutz.ioc.IocException: [aopLoader2] # com.shlx.blood.aop.AopLoader2 using @IocBean but not start with @IocBean(name="$aop_xxx")

2、这里不是设置了吗?

//IocBy 设置应用所采用的 Ioc 容器
@IocBy(type=ComboIocProvider.class, args={"*js", "ioc/",
        // 这个package下所有带@IocBean注解的类,都会登记上
                            "*anno", "com.shlx.blood",
                            "*tx", // 事务拦截 aop
                            "*async",
                            "*com.shlx.blood.aop.AopLoader", // 自定义aop注解加载器
                            "*com.shlx.blood.aop.AopLoader2" // 自定义aop注解加载器
                            }) // 异步执行aop
@SetupBy(value=MainSetup.class)  //SetupBy应用启动以及关闭时的额外处理
@Modules(scanPackage=true) //Modules声明应用的所有子模块
@Ok("json")
@Fail("json")
@ChainBy(args="mvc/shlxoa-mvc-chain.js")
//@Filters({@By(type=CheckSessionFilter.class)})
public class MainModule {

要加name的

@IocBean(name="$aop_abc")

且@IocBy里面删掉引用就ok了

话说 name=后面带$符号有什么特殊用途或约定吗

一些特殊取值,文档里面有描述

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