在 WebSphere 9 上的 JSF 2.2 中管理 bean



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

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

进一步阅读,我意识到 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?

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

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

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

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

设置:

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

希望它对某人有所帮助。

最新更新