是否可以从@ManagedBean截取方法?如果不是,有其他选择吗?

问题描述:

我是JSF-2和CDI的新手(我来自Spring世界)。是否可以从@ManagedBean截取方法?如果不是,有其他选择吗?

我想从@ManagedBean截取一个方法,但是我的Interceptor类永远不会被调用。有可能吗?

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; 
    } 
} 



RoleMB

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

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

所以,你已经基本上2种选择:

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

  2. 拦截EJB上的方法来代替它然后由JSF管理bean调用。在一个理智的Java EE应用程序中,真正的业务逻辑无论如何都属于EJB。

+0

反应良好,在JSF 2.2所有的JSF豆类应该是CDI豆,所以这不会是在Java EE中的问题7. – LightGuard 2013-03-26 14:49:51

+0

我们可以在JSF 2.1,虽然也做到这一点,我们不能,@ LightGuard? 2.2有什么改变吗? – DavidS 2015-05-26 17:43:03

+1

@DavidS:JSF 2.2引入了一个新的范围,它不与'@ ManagedBean'向后兼容,因此暗示他们停止支持'@ ManagedBean'。它将在Java EE 9中被弃用,或者已经被弃用。 – BalusC 2015-05-26 17:44:41