【问题标题】:Is it possible intercept a method from @ManagedBean? If not, there alternatives?是否可以拦截来自@ManagedBean 的方法?如果没有,有替代方案吗?
【发布时间】:2013-03-15 01:11:39
【问题描述】:

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

我想拦截来自@ManagedBean 的方法,但我的拦截器类从未被调用。有可能吗?

LogInterceptor.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) {
        ...
    }
}



beans.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) 永远不会被调用。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 很好的响应,在 JSF 2.2 中所有 JSF bean 都应该是 CDI bean,所以这在 Java EE 7 中不会成为问题。
    • 我们也可以在 JSF 2.1 中做到这一点,不是吗,@LightGuard? 2.2 中还有其他变化吗?
    • @DavidS:JSF 2.2 引入了一个不向后兼容@ManagedBean 的新作用域,在此暗示他们停止支持@ManagedBean。它会在 Java EE 9 或者已经是 8 中被弃用。
    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多