gpt4 book ai didi

java - 在自定义范围内使用注入(inject)

转载 作者:行者123 更新时间:2023-11-30 02:39:27 24 4
gpt4 key购买 nike

是否可以使用 @SessionScoped bean 作为自定义作用域上下文中的字段?

我正在使用 CDI 编写自定义范围(“ScreenScoped”),因此它的行为与 CDI 的 @ViewScoped 大致相同(我这样做是因为后者与 WebSphere 不兼容)。到目前为止,我的作用域就像 @ApplicationScoped 一样。我想使用我的 @SessionScoped NavigationHandler 类(每次用户单击链接或按钮时都会调用该类)来确定 ScreenScoped 生命周期何时结束。但是,当我尝试使用 @Injected 字段时,我确实收到错误。

public class ScreenContext
implements Context
{
@Inject
private NavigationHandler navigationHandler;
...
}

由于这个@Inject而出现NullPointerException:

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行是我第一次调用注入(inject)的字段:

System.out.println("Navigation is used: " + navigationHandler.getUserId());

最佳答案

你不能在 Context 中注入(inject) Bean 。您需要使用BeanManager访问 NavigationHandler bean 。

您的上下文是通过 CDI 扩展观察注册的 AfterBeanDiscovery CDI 生命周期的事件。在这里您可以传递 BeanManager到上下文:

public void afterBeanDiscovery (@Observes final AfterBeanDiscovery event, final BeanManager beanManager)
{
event.addContext(new ScreenContext(beanManager));
}

然后在你的 ScreenContext 中实现你可以得到 NavigationHandler bean(在下面的myMethod中)使用BeanManager :

public class ScreenContext implements Context
{

private final BeanManager m_beanManager;

public ScreenContext(final BeanManager p_BeanManager)
{
m_beanManager = p_BeanManager;
}

public void myMethod()
{
NavigationHandler NavigationHandlerBean = getNavigationHandler();
...
...
}

private NavigationHandler getNavigationHandler()
{
final Set<Bean<?>> beans = m_beanManager.getBeans(NavigationHandler.class);
final Bean<?> bean = m_beanManager.resolve(beans);

return (NavigationHandler) m_beanManager.getReference(bean, NavigationHandler.class, m_beanManager.createCreationalContext(bean));
}

关于java - 在自定义范围内使用注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com