Java 在WebSphere9上的JSF2.2中管理bean
发布此问题/答案,因为我没有发现任何其他非常类似的问题。很多相关的,但不是相同的场景 正在将JSF2.1升级为JSF2.2(Mojarra)应用程序,以支持h:fileUpload。应用程序在WebSphere9上运行,升级后使用JSFbean进行依赖注入时遇到问题 进一步阅读,我意识到JSFJava 在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,
@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,方式与以前相同