3

我是 JSF-2 和 CDI 的新手(我来自 Spring 世界)。

我想从 @ManagedBean 拦截一个方法,但我的 Interceptor 类从未被调用。有可能吗?

日志拦截器.java

@Interceptor
public class LogInterceptor {

    @AroundInvoke
    public Object log(InvocationContext ctx) throws Exception {
        System.out.println("begin method interceptor");
        Object methodReturn = ctx.proceed();
        System.out.println("end method interceptor");

        return methodReturn;
    }   
}



角色MB

@ManagedBean
@ViewScoped
public class RoleMB extends BaseMB {

    @Interceptors(LogInterceptor.class)
    public void preEditRole(Role role) {
        ...
    }
}



豆类.xml

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

    <interceptors>
        <class>br.com.preventsenior.services.log.LogInterceptor</class>
    </interceptors>

</beans>



log(InvocationContext ctx)永远不会被调用。

4

1 回答 1

9

Java EE 拦截器仅适用于 CDI 托管 bean 和 EJB,而不适用于 JSF 托管 bean。

所以,你基本上有两个选择:

  1. 通过 CDI bean 管理注释(@Named等)更改 JSF bean 管理注释

  2. 拦截 EJB 方法,而该方法又由 JSF 托管 bean 调用。在一个健全的 Java EE 应用程序中,真正的业务逻辑无论如何都属于 EJB。

于 2013-03-25T14:03:18.633 回答