JFinal2.1中尝试对Model进行增强,发现拦截器执行了两次

hypocrite11 发布于 2016/01/07 17:57
阅读 764
收藏 0

@JFinal 你好,想跟你请教个问题:

在JFinal2.1中尝试对Model(User)进行增强,发现拦截器(ModelInterceptor.java)执行了两次,能否分析下是什么原因。

User.java


/**
 * Generated by JFinal.
 */
@SuppressWarnings("serial")
public class User extends BaseUser<User> {

	//public static final User dao = new User();
	public static final User dao = Enhancer.enhance(User.class, ModelInterceptor.class);
	public Page<User> paginate(int pageNumber, int pageSize) {
		return paginate(pageNumber, pageSize, "select *", "from pt_user order by ids asc");
	}
}



UserController.java



@Before(UserValidator.class)
	public void getUserListpaginate() {

		renderJson("result", User.dao.paginate(getParaToInt("pageNumber"), getParaToInt("pageSize")));	
	}


ModelInterceptor.java

public class ModelInterceptor implements Interceptor {
		
	@Override
	public void intercept(Invocation invoc) {
	
		invoc.invoke();
		
		System.out.println("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
		
	}
	
	
}




执行结果

dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd


JFinal action report -------- 2016-01-07 17:57:18 ------------------------------
Controller  : com.platform.mvc.user.UserController.(UserController.java:1)
Method      : getUserListpaginate
Interceptor : com.platform.config.run.GlobalInterceptor.(GlobalInterceptor.java:1)
              com.jfinal.plugin.activerecord.tx.TxByMethods.(TxByMethods.java:1)
              com.jfinal.plugin.activerecord.tx.TxByMethodRegex.(TxByMethodRegex.java:1)
              com.platform.mvc.user.UserValidator.(UserValidator.java:1)
--------------------------------------------------------------------------------




加载中
0
JFinal
JFinal

     原因很简单,注意这一行代码: Enhancer.enhance(User.class, ModelInterceptor.class); 这样声明的拦截器属于 Inject Interceptor,此类拦截器会拦截目标类中的所有方法,所以当你调用 User.paginate(...) 方法时会被拦截一次,而这个 paginate 方法调用了父类的 paginate 方法,又再被拦截一次,所以一共是两次。

    这就好比在Controller 中,有两个 action 都声明了拦截器,然后你从一个 action 中调用 forwardAction 到另一个 action 的时候也会触发另一个 action 的拦截器。但控制层与业务层不同的是,控制层需要 forwardAction 才会触发,但业务层方法转调就可以触发,只要是被转调的目标方法上有安插拦截器,例如,本例中就安插了 inject 拦截器。

    如果是一个类中很多方法存在转调,并且带有global、inject、class 三个级的拦截器,建议使用 @Before 来在method中声明拦截器,以免多次反复调用某拦截器。

JFinal
JFinal
回复 @hypocrite11 : 用 @Before 声明拦截器省事,常用
h
hypocrite11
初学者谢谢波总的回答。其实是想对jfinal的model对象的某些方法做拦截,有些方法是定义在jfinal最底层的model类里面。所以才会想用inject拦截器。看来这种方法行不通,只能尝试自己封装一个共通的model类重写jfinal的model的一些方法了。其实本来是不想照@JFinalUIB的思路做的。省得升级麻烦。
0
hyanqing
hyanqing
是不是你配进全局拦截器里啊,Enhancer.enhance()这个方法其实也算拦截器的,所以最好是二选一,要么用拦截器,要么用Enhancer.enhance()
0
JFinal
JFinal
    再补充一点,inject 拦截器通常是为了不去改变目标类中的代码而使用的,例如,目标代码在 jar 之中
返回顶部
顶部