2

我已经仔细阅读了 Seam/Weld 文档中关于拦截器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 @ViewScopedbean 中激活拦截器:

@javax.inject.Named;
@javax.faces.bean.ViewScoped
public class MyBean implements Serializable
{
  @PostConstruct @MyLog
  public void init()
  {...}

  @MyLog public void toggleButton()
  {..}
}

如果我在我的 JSF 页面上按下一个按钮,则该方法toggleButton会被正确调用调用Interceptor 方法logMethodEntry。但似乎该方法@PostConstruct(我感兴趣)从未被我的班级截获。

这个问题似乎与Java EE 拦截器和 @ViewScoped bean有关,但实际上我的拦截器正在以正常方法工作。

4

1 回答 1

0

您应该将@PostConstruct拦截器的返回类型设置为voidnot Object。改变:

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

至:

  @PostConstruct
  public void logPostConstruct(InvocationContext invocationContext) throws Exception
  {...}
于 2015-09-04T09:25:24.143 回答