2011-02-28 10 views
37

[resorte 3.0.5] [Jboss 5,1]JSR-303 anotación @Valid (objeto anidado) que no trabaja

Mis principales clases es

public class UserAddressesForm { 

    @NotEmpty 
    private String firstName; 

    @NotEmpty 
    private String lastName; 

    private List<AddressForm> addresses; 

... 
setters and getters 

public class AddressForm { 

    @NotEmpty 
    private String customName; 
    @NotEmpty 
    private String city; 
    @NotEmpty 
    private String streetAn; 
    @NotEmpty 
    private String streetHn; 
    @NotEmpty 
    private String addressCountry; 
    @NotEmpty 
    private String postCode; 
... 
setters and getters 

A Controller

@RequestMapping(value = "/up", method = RequestMethod.POST) 
    public String completeForm(@Valid @ModelAttribute("userAddressesForm") UserAddressesForm userAddressesForm, 
      BindingResult result, HttpServletRequest req) 
... 

A JSP página

<form:form commandName="userAddressesForm" action="registered"> 
    <table> 

     <tr> 
      <td class="formLabels"><form:label path="firstName"> 
       <spring:message code="label.name" /> 
      </form:label></td> 
      <td><form:input path="firstName" /></td> 
      <td><form:errors path="firstName" cssClass="error" /></td> 
     </tr> 
     <tr> 
      <td class="formLabels"><form:label path="lastName"> 
       <spring:message code="label.surname" /> 
      </form:label></td> 
      <td><form:input path="lastName" /></td> 
      <td><form:errors path="lastName" cssClass="error" /></td> 
     </tr> 
    </table> 

    <c:forEach items="${userAddressesForm.addresses}" varStatus="gridRow"> 
     <div id="main_address" class="address_data_form"> 
      <fieldset> 
       <legend><spring:message code="label.stepThreeMainAddressInfo" /></legend> 
       <a href="#" class="deleteItem"></a> 
       <table> 
        <tr>    
         <td class="formLabels"> 
          <spring:message code="label.address.custom.name" /> 
         </td> 
         <td> 
          <spring:bind path="addresses[${gridRow.index}].customName"> 
           <input type="input" name="<c:out value="${status.expression}"/>" 
            id="<c:out value="${status.expression}"/>" 
            value="<c:out value="${status.value}"/>" /> 
            <form:errors path="${status.expression}"/> 
          </spring:bind> 
         </td> 
        </tr>    
        <tr>    
         <td class="formLabels"> 
          <spring:message code="label.streetAnStreetHn" /> 
         </td> 
         <td> 
          <spring:bind path="addresses[${gridRow.index}].streetAn"> 
           <input type="input" name="<c:out value="${status.expression}"/>" 
            id="<c:out value="${status.expression}"/>" 
            value="<c:out value="${status.value}"/>" /> 
          </spring:bind> 
          <spring:bind path="addresses[${gridRow.index}].streetHn"> 
          <input type="input" name="<c:out value="${status.expression}"/>" 
           id="<c:out value="${status.expression}"/>" 
           value="<c:out value="${status.value}"/>" > 
          <form:errors path="addresses[${gridRow.index}].streetHn"/> 
          </spring:bind> 

         </td> 
        </tr> 
        <tr>       
         <td class="formLabels"> 
          <spring:message code="label.postCode" /> 
         </td> 
         <td> 
          <spring:bind path="addresses[${gridRow.index}].postCode"> 
           <input type="input" name="<c:out value="${status.expression}"/>" 
            id="<c:out value="${status.expression}"/>" 
            value="<c:out value="${status.value}"/>" /> 
          </spring:bind> 
         </td>     
        </tr> 
        <tr>     
         <td class="formLabels"> 
          <spring:message code="label.city" /> 
         </td> 
         <td> 
          <spring:bind path="addresses[${gridRow.index}].city"> 
           <input type="input" name="<c:out value="${status.expression}"/>" 
            id="<c:out value="${status.expression}"/>" 
            value="<c:out value="${status.value}"/>" /> 
           <form:errors path="addresses[${gridRow.index}].city" cssClass="error" /> 
          </spring:bind> 
         </td> 
        </tr>  
       </table>  
      </fieldset> 
     </div> 
    </c:forEach> 

Why object fields no son validados AddressForm?

Por favor ayuda.

Respuesta

76

Necesita decorar addresses miembro de UserAddressesForm con @Valid anotación. Consulte la sección 3.1.3 y 3.5.1 de JSR 303: Bean Validation. Como he explicado en mi respuesta a la pregunta Is there a standard way to enable JSR 303 Bean Validation using annotated method, esto es el uso real de @Valid anotación como por JSR 303.

Editar código Ejemplo: Hibernate Validator- Object Graph. (La lista de pasajeros en el automóvil)

+1

Gracias por la maravillosa respuesta – dharam

+0

Enlace parece ¡han cambiado! – eduardohl

+0

gracias. actualizado a http://beanvalidation.org/1.0/spec/#constraintdeclarationvalidationprocess – Ritesh

8

Al agregar a la respuesta @Ritesh, la restricción @Valid le indicará al Bean Validator que profundice en el tipo de su propiedad aplicada y valide todas las restricciones encontradas allí. Responder con código a su pregunta, el validador, al ver una restricción @Valid en addresses propiedad, explorará la clase AddressForm y validar todos los JSR 303 limitaciones que se encuentran en el interior, de la siguiente manera:

public class UserAddressesForm { 

    @NotEmpty 
    private String firstName; 

    @NotEmpty 
    private String lastName; 

    @Valid 
    private List<AddressForm> addresses; 

... 
setters and getters 

public class AddressForm { 

    @NotEmpty 
    private String customName; 
    @NotEmpty 
    private String city; 
    @NotEmpty 
    private String streetAn; 
    @NotEmpty 
    private String streetHn; 
    @NotEmpty 
    private String addressCountry; 
    @NotEmpty 
    private String postCode; 
... 
setters and getters 
+0

¿Qué pasa con la agrupación? Quiero que la dirección se valide solo cuando el grupo A está validado. @Valid ignora el grupo – Akshay