model validation failed
davidclf Sep 18, 2007 3:53 AMI try to migrate Dan Allen's <<Seamless JSF>> example to seam 2.0,
the program startups success,but when I edit the course and click save button,the page return "model validation failed" message!
follows is error page:
"Course Name Type Public Private Semi-Private Resort Military Website Phone Country model validation failed:/courseEditor.jspx @70,116 value="#{course.address.country}": Target Unreachable, 'address' returned null on 'com.ibm.dw.open18.Course' State model validation failed:/courseEditor.jspx @78,86 value="#{course.address.state}": Target Unreachable, 'address' returned null on 'com.ibm.dw.open18.Course' County model validation failed:/courseEditor.jspx @88,114 value="#{course.address.county}": Target Unreachable, 'address' returned null on 'com.ibm.dw.open18.Course' City model validation failed:/courseEditor.jspx @96,110 value="#{course.address.city}": Target Unreachable, 'address' returned null on 'com.ibm.dw.open18.Course' ZIP Code model validation failed:/courseEditor.jspx @104,122 value="#{course.address.postalCode}": Target Unreachable, 'address' returned null on 'com.ibm.dw.open18.Course''
my web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Open 18 (Phase 1)</display-name> <description>JBoss Seam Sample Application</description> <context-param> <description> Comma separated list of URIs that serve as spring configuration files </description> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring-beans.xml </param-value> </context-param> <filter> <filter-name>Seam Redirect Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> </filter> <filter-mapping> <filter-name>Seam Redirect Filter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class> </listener> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.jspx</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
my componets.xml
<?xml version="1.0" encoding="UTF-8"?> <components xmlns="http://jboss.com/products/seam/components" xmlns:core="http://jboss.com/products/seam/core" xmlns:persistence="http://jboss.com/products/seam/persistence" xmlns:transaction="http://jboss.com/products/seam/transaction" xmlns:spring="http://jboss.com/products/seam/spring" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.0.xsd http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.0.xsd http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.0.xsd http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd"> <!-- NOTE: this file can be used to provide IoC injection of spring-defined beans, instead of using the @In annotation --> <!-- enable the /debug.action page --> <core:init debug="true" /> <!-- <core:pages no-conversation-view-id="/main.jspx" /> --> <core:manager conversation-timeout="60000" concurrent-request-timeout="500" conversation-id-parameter="cid" /> <!-- <core:ejb installed="false" /> <core:microcontainer installed="false" /> --> <!--<persistence:hibernate-session-factory name=""/>--> <persistence:managed-hibernate-session name="courseDatabase" session-factory="#{sessionFactory}" auto-create="true"/> <transaction:hibernate-transaction session="#{courseDatabase}"/> <!-- Enabling the debug property will generate an AJAX console (but you could just use FireBug) --> <component name="org.jboss.seam.remoting.remotingConfig"> <property name="debug">false</property> </component> </components>
my faces-config.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"> <faces-config> <application> <view-handler> com.sun.facelets.FaceletViewHandler </view-handler> <variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </variable-resolver> <locale-config> <default-locale>en_US</default-locale> </locale-config> <message-bundle>MessageBundle</message-bundle> </application> </faces-config>
the courseEditor.jspx:
<?xml version="1.0" encoding="UTF-8"?> <jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:c="http://java.sun.com/jstl/core" version="2.0"> <ui:composition template="/templates/master.jspx"> <ui:define name="title"> <h:outputText value="#{course.id gt 0 ? 'Edit' : 'Create'} Course" /> </ui:define> <ui:define name="body"> <h:form id="course"> <s:validateAll> <f:facet name="aroundInvalidField"> <s:span styleClass="invalid"/> </f:facet> <f:facet name="afterInvalidField"> <s:span styleClass="message">#{spacer}<s:message showDetail="true" showSummary="false" /></s:span> </f:facet> <table class="detail"> <colgroup> <col width="20%" /> <col width="80%" /> </colgroup> <tr> <th><h:outputLabel for="name" value="Course Name" /></th> <td> <s:decorate> <h:inputText id="name" value="#{course.name}" size="40" styleClass="text"/> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="type" value="Type" /></th> <td> <s:decorate> <h:selectOneMenu id="type" value="#{course.type}"> <s:convertEnum /> <s:enumItem enumValue="PUBLIC" label="Public" /> <s:enumItem enumValue="PRIVATE" label="Private" /> <s:enumItem enumValue="SEMI_PRIVATE" label="Semi-Private" /> <s:enumItem enumValue="RESORT" label="Resort" /> <s:enumItem enumValue="MILITARY" label="Military" /> </h:selectOneMenu> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="uri" value="Website" /></th> <td> <s:decorate> <h:inputText id="uri" value="#{course.uri}" size="40" styleClass="text" /> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="phone" value="Phone" /></th> <td> <s:decorate> <h:inputText id="phone" value="#{course.phoneNumber}" size="10" styleClass="text" /> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="country" value="Country" /></th> <td> <s:decorate> <h:inputText id="country" value="#{course.address.country}" required="true" size="40" styleClass="text" /> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="state" value="State" /></th> <td> <s:decorate> <h:selectOneMenu id="state" value="#{course.address.state}" required="true"> <s:selectItems var="state" value="#{states}" label="#{state}" noSelectionLabel="" /> </h:selectOneMenu> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="county" value="County" /></th> <td> <s:decorate> <h:inputText id="county" required="true" value="#{course.address.county}" size="40" styleClass="text" /> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="city" value="City" /></th> <td> <s:decorate> <h:inputText id="city" required="true" value="#{course.address.city}" size="40" styleClass="text" /> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="postalCode" value="ZIP Code" /></th> <td> <s:decorate> <h:inputText id="postalCode" required="true" value="#{course.address.postalCode}" size="40" styleClass="text" /> </s:decorate> </td> </tr> <tr> <th><h:outputLabel for="description" value="Description" /></th> <td> <s:decorate> <h:inputTextarea id="description" value="#{course.description}" cols="38" rows="4"/> </s:decorate> </td> </tr> </table> </s:validateAll> <p class="commands"> <h:commandButton id="save" action="#{courseAction.saveCourse}" value="Save" styleClass="button" /> #{spacer} <s:button id="cancel" action="#{courseAction.clearSelection}" value="Cancel" styleClass="button" /> </p> </h:form> </ui:define> </ui:composition> </jsp:root>
Any idea to solve it ? Is it a bug ?
Many thanks in advance!