【问题标题】:@PostConstruct Interceptor with @Named @ViewScoped not invoked未调用 @Named @ViewScoped 的 @PostConstruct 拦截器
【发布时间】: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


【解决方案1】:

你应该将@PostConstruct拦截器的返回类型设置为void而不是Object。 变化:

  @PostConstruct
  public Object logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}

到:

  @PostConstruct
  public void logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2015-08-14
    • 2018-09-04
    • 1970-01-01
    • 2017-10-24
    相关资源
    最近更新 更多