Java 在WebSphere9上的JSF2.2中管理bean

Java 在WebSphere9上的JSF2.2中管理bean,java,cdi,jsf-2.2,Java,Cdi,Jsf 2.2,发布此问题/答案,因为我没有发现任何其他非常类似的问题。很多相关的,但不是相同的场景 正在将JSF2.1升级为JSF2.2(Mojarra)应用程序,以支持h:fileUpload。应用程序在WebSphere9上运行,升级后使用JSFbean进行依赖注入时遇到问题 进一步阅读,我意识到JSF@ManagedBean将被弃用,应该迁移到CDI@Named,但我们的应用程序有627个FacesContext引用,迁移到CDIBean意味着更新所有这些位置,以便在需要时生成FacesContext,

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

正在将JSF2.1升级为JSF2.2(Mojarra)应用程序,以支持h:fileUpload。应用程序在WebSphere9上运行,升级后使用JSFbean进行依赖注入时遇到问题

进一步阅读,我意识到JSF
@ManagedBean
将被弃用,应该迁移到CDI
@Named
,但我们的应用程序有627个FacesContext引用,迁移到CDIBean意味着更新所有这些位置,以便在需要时生成FacesContext,或者将JSF升级到2.3,并在需要的地方注入FacesContext。这意味着现在要继续使用JSF2.2

下面是bean:

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时,为什么我们会在
ViewScopedDieventFireHelperImpl.java
中得到一个NPE???

我不知道其他企业容器是否也是这样,但对于WebSphere,CDI是默认启用的,并且显然在运行时覆盖或试图替换JSF bean(?)。但愿我对这个场景中容器中发生的事情有更多的了解

在IBM站点上找到以下关于CDI设置的内容:

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

设置:

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

希望它能帮助别人。

ManagedBean
已被弃用,并被CDI注释(
@Named
)取代。您可能想改用它。您的类可以声明为javax.inject.Named javax.faces.view.ViewScoped。此外,类名应大写第一个字母CustomerSearchManager。设置ManagedBean的名称是不必要的,因为默认名称是customerSearchManager(首字母小写)。使用CDI,您可以使用javax.inject.inject代替ManagedProperty。您仍然可以使用FacesContext,方式与以前相同