【问题标题】:Interceptors don't work with JSF managed beans?拦截器不适用于 JSF 托管 bean?
【发布时间】:2015-10-28 06:42:09
【问题描述】:

我决定试试interceptors我的第一个拦截器绑定注解是

@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>

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

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

【问题讨论】:

    标签: jsf jsf-2 cdi interceptor managed-bean


    【解决方案1】:

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

    正确。

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

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

    另见:

    【讨论】:

    • 我试图将@ManagedBean 替换为@Named,但@ViewScoped 不起作用,并且所有由@Named 注释的bean(我认为)都是请求范围。如何与这种行为作斗争?有趣的是,在具有相同 Maven 的同一 IDE 中创建的其他项目中,没有这样的行为。这是什么?
    • 如回答,您还需要替换“朋友”。换句话说,除其他外,还有相关的范围注释。使用 CDI 的 @ViewScoped 而不是 JSF 的。另见 a.o. stackoverflow.com/q/20251176
    • 好吧,我想,我明白我的错误了。谢谢你的帖子。
    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 2023-03-05
    • 1970-01-01
    • 2021-10-20
    • 2015-02-23
    • 1970-01-01
    • 2016-07-09
    • 2012-10-13
    相关资源
    最近更新 更多