0

CDI による傍受は @Named では完全に機能しますが、@ManagedBean では機能しません。

Logable.java

@InterceptorBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Logable {

}

LoggingInterceptor.java

@Logable
@Interceptor
public class LoggingInterceptor {
@AroundInvoke
    public Object log(InvocationContext ctx) throws Exception {
//log smth. with ctx.
}
}

WorkingBean.java

@Named
@Logable
public class WorkingBean implements Serializable {
 //works : methods will be logged
}

ビーンズ.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <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>LoggingInterceptor</class>
</interceptors>

</beans>

ViewScopedBean.java

@Logable
@ManagedBean
public class ViewScopedBean implements Serializable {
 //doesn't work
}

この種のインターセプターは WebBeans (および EJB) で動作するように意図されていることは承知していますが、同じインターセプターの概念を持つ両方の世界 (記述 + JSF)のソリューションを探しています @ViewScoped @ManagedBean が必要です。純粋な WebBeans を支持して @ManagedBean を取り除くことはできません

システム: Mojarra 2.1.7 Primefaces 3.2

4

2 に答える 2

1

私の知る限り、一つもありません。JSF には傍受をサポートするものは何もありません。

于 2012-06-28T20:20:14.097 に答える
1

あなたが投稿したように、JSFはCDIインターセプトをサポートしていません。CDI インターセプターは、次のようなライフサイクル メソッドで機能します。@PostConstruct

    @Inherited
    @InterceptorBinding
    @Retention(RUNTIME)
    @Target({TYPE})
    public @interface TypeLogger {

      @Nonbinding
      public LoggingLevel logLevel() default LoggingLevel.INFO;
    }

にのみバインドされるため、使用方法は次のとおりです。@Target({TYPE})

    @ManagedBean
    @ViewScoped
    @TypeLogger
    public class Index implements Serializable {

       private static final long serialVersionUID = 3336392241545517919L;

       @PostConstruct
       private void init() {
         setup();
       }
    }
于 2012-11-21T12:24:13.300 に答える