beanをカスタムスコープのコンテキストのフィールドとして使用できますか?カスタムスコープでの注入の使用
私はCDIのカスタムスコープ( "ScreenScoped")を作成していますので、CDIの@ViewScoped
とほぼ同じ動作をします(後者はWebSphereと互換性がないためです)。これまでのところ私の範囲は@ApplicationScoped
のようになります。 @SessionScoped NavigationHandler
クラスを使用したいと思います。これは、ユーザーがリンクやボタンをクリックするたびに呼び出され、ScreenScopedのライフサイクルが終了するタイミングを決定します。しかし、私は@Inject
エドフィールドを使用しようとするとエラーが発生します。
public class ScreenContext
implements Context
{
@Inject
private NavigationHandler navigationHandler;
...
}
A NullPointerExceptionがあるため、この@Inject
で表示されます:
16:55:07,492 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (http-localhost/127.0.0.1:8443-10) Error Rendering View[/page/hello.xhtml]: javax.el.ELException: /page/hello.xhtml @24,58 visible="#{helloController.popupshowed}": java.lang.NullPointerException
...
Caused by: java.lang.NullPointerException
at com.mypackage.scope.screenscope.ScreenContext.get(ScreenContext.java:38) [myproject.jar:]
ライン38は、私が注入されたフィールドを呼び出す最初の時間です:あなたはContext
で豆を注入することはできません
System.out.println("Navigation is used: " + navigationHandler.getUserId());
使用BeanManager:
BeanManager
を使用して(以下myMethod
に)そしてあなた
ScreenContext
実装では、あなたがNavigationHandler
Beanを取得することができます:それはあなたがコンテキストにBeanManager
を渡すことをここですNavigationHandler bean – RouliboyカスタムコンテキストがExtension経由で登録されているため、注入は実行できません – Rouliboy