如何验证selectOneMenu值?

时间:2012-10-19 04:21:12

标签: jsf-2

我正在验证我的表单,我可以获得textbox的值但总是检索null值 uiClass变量(Error: java.lang.NullPointerException): 有什么建议吗?

例外:

WARNING: /jsf/report/Edit.xhtml @39,99 listener="#{studentController.validate}": java.lang.NullPointerException
javax.el.ELException: /jsf/report/Edit.xhtml @39,99 listener="#{studentController.validate}": java.lang.NullPointerException
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
    at com.sun.faces.facelets.tag.jsf.core.DeclarativeSystemEventListener.processEvent(EventHandler.java:131)
    at javax.faces.component.UIComponent$ComponentSystemEventListenerAdapter.processEvent(UIComponent.java:2464)
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106)
    at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2168)
    at com.sun.faces.application.ApplicationImpl.invokeComponentListenersFor(ApplicationImpl.java:2116)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:288)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:246)

Caused by: java.lang.NullPointerException
    at entities.StudentController.validate(StudentController.java:163)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)  

@ManagedBean()
@SessionScoped
public class StudentController implements Serializable {
    public void validate(ComponentSystemEvent event) {
        FacesContext fc = FacesContext.getCurrentInstance();
        UIComponent components = event.getComponent();

        UIInput uiName = (UIInput) components.findComponent("frmStudent:name");
        UIInput uiClass = (UIInput) components.findComponent("frmStudent:myclass");

        String name = uiName.getLocalValue().toString();
        String myclass = uiClass.getLocalValue().toString();

        if (name.equals("") || name == null || name.isEmpty()) {
            FacesMessage msgName = new FacesMessage("Please enter name !");
            fc.addMessage(components.getClientId(), msgName);
            fc.renderResponse();
        } else if (myclass.equals("") || myclass == null || myclass.isEmpty()) {
            FacesMessage msgClass = new FacesMessage("Please select a class !");
            fc.addMessage(components.getClientId(), msgClass);
            fc.renderResponse();
        }
    }
}

我的XHTML

<h:message for="textPanel" style="color:red;" />
<h:panelGrid id="textPanel" columns="4">
  <f:event listener="#{studentController.validate}" type="postValidate" />
    <h:inputText id="name" value="#{studentController.selected.name}" size="20" />
    <h:selectOneMenu id="myclass" value="#{studentController.selected.myclass}" style="width:180px;">
        <f:selectItem itemLabel="Select ..." itemValue="#{null}" noSelectionOption="true" />
        <f:selectItems value="#{studentController.classItems}"/>
    </h:selectOneMenu>
</h:panelGrid>

1 个答案:

答案 0 :(得分:9)

为什么不使用必需的属性?

 <h:inputText id="name" required="true" requiredMessage="Please enter name !" value="#{studentController.selected.name}" size="20" />
    <h:selectOneMenu id="myclass" required="true" requiredMessage="Please select a class !" value="#{studentController.selected.myclass}" style="width:180px;">
        <f:selectItem itemLabel="Select ..." itemValue="#{null}" noSelectionOption="true" />
        <f:selectItems value="#{studentController.classItems}"/>
    </h:selectOneMenu>