【问题标题】:Managing beans in JSF 2.2 on WebSphere 9在 WebSphere 9 上的 JSF 2.2 中管理 bean
【发布时间】:2023-04-06 02:25:01
【问题描述】:

发布此问题/答案,因为我没有发现任何其他非常相似的问题。很多相关但不一样的场景。

正在将 JSF 2.1 升级到 JSF 2.2 (Mojarra) 应用程序以支持 h:fileUpload。应用程序在 WebSphere 9 上运行,升级后遇到了使用 JSF Beans 进行依赖注入的问题。

进一步阅读,我意识到 JSF @ManagedBean 将被弃用,应该迁移到 CDI @Named,但是我们的应用程序有 627 个对 FacesContext 的引用,并且迁移到 CDI bean 意味着更新所有这些地方以生成一个FacesContext 在需要时,或者将 JSF 升级到 2.3 并在需要的地方注入 FacesContext。这意味着暂时使用 JSF 2.2。

这是豆子:

package com.company.customersearch;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@ManagedBean(name = "customerSearchManager")
@ViewScoped
public class customerSearchManager extends PortletManager{

    private static final long serialVersionUID = -9050481751306478727L;
    private Long customerId;
    private SessionData sessionData;

    @ManagedProperty(value = "#{customerSearchService}")
    private CustomerSearchService service;

    public CustomerSearchManager(){
        this.sessionData = new SessionData((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false));
        if (sessionData.hasSelectedCustomer())
            this.customerId = sessionData.getData().getCustomerId();
    }   

...
}

在 WebSphere 9 上运行产生了 NullPointerException

Error Rendering View[/pages/customer-search.xhtml]
                                 java.lang.NullPointerException
    at com.sun.faces.application.view.ViewScopedCDIEventFireHelperImpl.fireInitializedEvent(ViewScopedCDIEventFireHelperImpl.java:60)
    at com.sun.faces.application.view.ViewScopeContextManager.fireInitializedEvent(ViewScopeContextManager.java:394)
    at com.sun.faces.application.view.ViewScopeManager.processPostConstructViewMap(ViewScopeManager.java:312)
    at com.sun.faces.application.view.ViewScopeManager.processEvent(ViewScopeManager.java:244)
    at com.sun.faces.application.view.ViewScopeEventListener.processEvent(ViewScopeEventListener.java:68)

NPE 来自 CDI 相关课程!当我们故意不使用 CDI 时,为什么我们会在 ViewScopedCDIEventFireHelperImpl.java 中获得 NPE??

【问题讨论】:

  • 您的类可以声明为 javax.inject.Named javax.faces.view.ViewScoped。类名也应该首字母大写 CustomerSearchManager。设置 ManagedBean 的名称是不必要的,因为默认值为 customerSearchManager(首字母小写)。使用 CDI,您可以使用 javax.inject.Inject 而不是 ManagedProperty。你仍然可以像现在一样使用 FacesContext

标签: java cdi jsf-2.2


【解决方案1】:

我不知道其他企业容器是否也是这种方式,但对于 WebSphere,CDI 默认启用,并且显然在运行时覆盖或尝试替换 JSF bean (??)。希望我对在这种情况下容器中发生的事情有更多的了解。

在 IBM 网站上找到以下有关 CDI 设置的信息:

http://www-01.ibm.com/support/docview.wss?uid=swg21983564

如果您真的打算使用 JSF @ManagedBeans 并避免与 CDI 发生冲突,那么您可以看到有 2 个属性需要在您的 JVM 上设置。为我工作。

设置:

com.ibm.ws.cdi.enableCDI = false
com.ibm.ws.cdi.enableImplicitBeanArchives  = false

希望对某人有所帮助。

【讨论】:

  • ManagedBean 已弃用并替换为 CDI 注释 (@Named)。您可能想改用它。
猜你喜欢
  • 2015-12-25
  • 2014-05-16
  • 2012-10-11
  • 2014-07-17
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多