Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 是否可以从@ManagedBean截取一个方法?如果没有,还有其他选择吗?_Jsf_Jsf 2_Cdi_Interceptor_Managed Bean - Fatal编程技术网

Jsf 是否可以从@ManagedBean截取一个方法?如果没有,还有其他选择吗?

Jsf 是否可以从@ManagedBean截取一个方法?如果没有,还有其他选择吗?,jsf,jsf-2,cdi,interceptor,managed-bean,Jsf,Jsf 2,Cdi,Interceptor,Managed Bean,我是JSF-2和CDI的新手(我来自SpringWorld) 我想从@ManagedBean截取一个方法,但从未调用我的截取器类。有可能吗 LogInterceptor.java @Interceptor public class LogInterceptor { @AroundInvoke public Object log(InvocationContext ctx) throws Exception { System.out.println("begin

我是JSF-2和CDI的新手(我来自SpringWorld)

我想从@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;
    }   
}


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>

br.com.preventsenior.services.log.LogInterceptor



从不调用
日志(InvocationContext ctx)

javaee拦截器只在CDI管理的bean和ejb上工作,而不在JSF管理的bean上工作

因此,您基本上有两种选择:

  • 通过CDIBean管理注释(
    @Named
    等)更改JSFBean管理注释

  • 而是在EJB方法上截取,该方法由JSF托管bean调用。在一个健全的JavaEE应用程序中,真正的业务逻辑无论如何都属于EJB


  • 很好的响应,在JSF2.2中,所有JSF bean都应该是CDIBeans,所以在JavaEE7中这不会是一个问题。我们也可以在JSF2.1中这样做,不是吗,@LightGuard?2.2中是否有其他变化?@DavidS:jsf2.2引入了一个新的作用域,它与
    @ManagedBean
    不向后兼容,因此暗示它们不再支持
    @ManagedBean
    。在JavaEE9或可能已经是JavaEE8中,它将被弃用。