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。
我有一个在 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。