【发布时间】:2012-10-28 08:18:48
【问题描述】:
我仔细阅读了Seam/Weld文档中关于Interceptors的文章并实现了InterceptorBinding:
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyLog {}
还有一个Interceptor 类:
@MyLog @Interceptor
public class ErpLogInterceptor implements Serializable
{
@AroundInvoke
public Object logMethodEntry(InvocationContext invocationContext) throws Exception
{..}
@PostConstruct
public Object logPostConstruct(InvocationContext invocationContext) throws Exception
{...}
}
不,我尝试在@Named @ViewScoped bean 中激活拦截器:
@javax.inject.Named;
@javax.faces.bean.ViewScoped
public class MyBean implements Serializable
{
@PostConstruct @MyLog
public void init()
{...}
@MyLog public void toggleButton()
{..}
}
如果我在我的 JSF 页面上按下按钮,则方法 toggleButton 会被正确调用并且拦截器方法 logMethodEntry 会被调用。但似乎@PostConstruct(我感兴趣的)方法从未被我的班级拦截。
这个问题似乎与Java EE Interceptors and @ViewScoped bean 有关,但实际上我的拦截器正在正常 方法中工作。
【问题讨论】:
-
您是否按照链接问题的答案中所述使用 CODI? JSF 特定的
@ViewScoped否则根本无法在 CDI 特定的@Named中工作。 -
你确定拦截器适用于生命周期方法吗?
-
@AdrianMitev:至少这些拦截器在我引用的文档中有所描述。
-
如果您使用 CDI 作用域而不是 JSF 作用域会发生什么(是的,我知道 Seam 3 改变了它,但它可能没有使用拦截器)?
-
@LightGuard:将范围更改为
@javax.enterprise.context.SessionScoped,但在@PostConstruct期间没有任何内容
标签: java jsf-2 cdi interceptor seam3