Ajax 在 SelectOneMenu 中导致 NullPointerException

Ajax in SelectOneMenu resulting in NullPointerException

我有一个在 Wildfly9 上运行良好的 Web 应用程序,但在 Websphere8 上让我头疼:

<h:form id="productsForm">
    <p:selectOneMenu id="productSelector"
        value="#{productManager.productName}" style="width: 100%;">
        <f:selectItem value="#{null}" />
        <f:selectItems value="#{productManager.products}"
            var="product" itemLabel="#{product.productName}"
            itemValue="#{product.productName}" />
        <p:ajax event="change" update="editProductButton" />
    </p:selectOneMenu>
    <p:button id="editProductButton"
        value="Edit Product" outcome="/pages/products/productDetails"
        style="float: left; margin-left: 10px;" disabled="#{productManager.productName == null}">
        <f:param name="productName"
            value="#{productManager.productName}" />
    </p:button>
</h:form>

Java 边:

private String productName;
private List<Product> products;


public String getProductName() {
    return this.productName;
}

public void setProductName(String productName) {
    this.productName = productName;
}
public List<Product> getProducts() {
    if(null == this.products){
        this.products = this.productService.findAll();
    }
    return this.products;
}

如果 selectOneMenu 中的项目是 selected,我希望启用 "edit" 按钮。在 Wildfly 上一切正常,在 websphere 上,当我 select 一个项目时发生以下异常:

com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0014E: Uncaught service() exception root cause Faces Servlet: javax.servlet.ServletException
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:221)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1224)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
[...]
Caused by: java.lang.NullPointerException
        at javax.faces.component._SelectItemsIterator.hasNext(_SelectItemsIterator.java:124)
        at javax.faces.component._SelectItemsUtil.matchValue(_SelectItemsUtil.java:48)
        at javax.faces.component.UISelectOne.validateValue(UISelectOne.java:77)
        at org.primefaces.component.selectonemenu.SelectOneMenu.validateValue(SelectOneMenu.java:282)
        at javax.faces.component.UIInput.validate(UIInput.java:583)
        at javax.faces.component.UIInput.processValidators(UIInput.java:247)
        at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:533)
        at org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:207)
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:773)
        at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1007)
        at javax.faces.component.UIForm.visitTree(UIForm.java:269)
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:793)
        at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1007)
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:793)
        at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1007)
        at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialExecute(PartialViewContextImpl.java:362)
        at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:342)
        at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60)
        at javax.faces.component.UIViewRoot$ProcessValidatorPhaseProcessor.process(UIViewRoot.java:1394)
        at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1282)
        at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:758)
        at org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:34)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
        ... 33 more

知道为什么会这样或如何fix/workaround吗?

WebSphere 使用 MyFaces 作为 JSF 实现,Wildfly 使用 Mojorra。这就是为什么你有不同的结果。

您已将空值定义为 selectItem。这破坏了代码。请改用空字符串。或者另一种解决方案是更改 JSF 实现。

还要考虑您的开发环境应始终尽可能接近 productive/final。