【发布时间】: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