jsf - 拦截器不适用于 JSF 托管 bean?

标签 jsf jsf-2 cdi interceptor managed-bean

我决定尝试拦截器 我的第一个拦截器绑定(bind)注释是

@Inherited
@InterceptorBinding
@Target({TYPE})
@Retention(RUNTIME)
public @interface WithLog {
  // No parameters required  
}

拦截器类是

@Interceptor
@WithLog
public class LogInterceptor {

  @AroundInvoke
  private Object logMethod(InvocationContext context) throws Exception {
    System.out.println("Method " + context.getMethod().getName() + 
        " of class " + context.getTarget().getClass().getName() + " was called.");
    return context.proceed();
  }

  @PostConstruct
  private void construct(InvocationContext context) {
    System.out.println("@Postconstruct of " + 
        context.getMethod().getDeclaringClass().getName() + " started.");
  }
}

所以,我想为 JSF 托管 bean 添加简单的日志记录:

@ManagedBean(name = "departmentRootMB")
@ViewScoped
@WithLog
public class DepartmentRootMB implements Serializable {

  long serialVersionUID = 0L;
// . . . properties, methods

}

我读到,要启用拦截器,我需要创建 beans.xml。我在 WEB-INF 目录下创建了一个:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="annotated">
    <interceptors>
        <class>ru.edu.pgtk.weducation.interceptors.LogInterceptor</class>
    </interceptors>
</beans>

我重建项目但没有效果。错误在哪里?我做错了什么?我使用带有标准组件(WELD、EclipseLink、JSF 2.2.7)的 glassfish 4.1

感谢您的宝贵时间和最诚挚的问候。

最佳答案

Interceptors don't work with JSF managed beans?

正确。

用 CDI bean 管理工具替换 JSF bean 管理工具。

换句话说,将@ManagedBean 和friends 替换为@Named 和friends。无论如何,JSF bean 管理工具都按计划在未来的 Java EE 版本中弃用以支持 CDI。现在是迁移的好机会。

另见:

关于jsf - 拦截器不适用于 JSF 托管 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31833357/

相关文章:

debugging - JSF <用户界面 :debug> not showing CDI beans

javascript - Primefaces 以编程方式触发的事件触发两次

java - JSF:a4j:轮询和性能损失

java - 如何在 JSF 2.0 中获取选项卡式 Pane 组件 (Sun Mojarra)

jakarta-ee - 如果通过 Provider.get() 获取 @Dependent 作用域的 CDI bean,何时会销毁该 bean?

ejb - CDI + EJB 3 + EJB 事务

jsf - 这个 faces-config.pageflow.xml 文件是从哪里来的?

java - 使用 JSF 标签添加了文本框,但在屏幕上不可见

jsf - JSF 2.0文件上传

jsf-2 - Bean 验证在 JSF2.2 (Majorra 2.2.5) 下不起作用