拦截器不能使用JSF托管bean吗?

时间:2015-08-05 13:02:26

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

我决定尝试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)

感谢您的时间和最好的问候。

1 个答案:

答案 0 :(得分:1)

  

拦截器不能与JSF托管bean一起使用?

正确。

通过CDI bean管理工具替换JSF bean管理工具。

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

另见:

相关问题