我的主要课程是
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
控制器
@RequestMapping(value = "/up", method = RequestMethod.POST) public String completeForm(@Valid @ModelAttribute("userAddressesForm") UserAddressesForm userAddressesForm, BindingResult result, HttpServletRequest req) ...
JSP页面
<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>
为什么对象字段未通过AddressForm验证?
从Hibernate Validator 6参考文档中编辑:
在6之前的版本中,Hibernate Validator支持对容器元素子集的级联验证,并且它是在容器级别实现的(例如,你将用于@Valid private List<Person>启用的级联验证Person)。
@Valid private List<Person>
Person
仍然支持,但不建议这样做。请改用容器元素级别的@Valid注释,因为它更具表现力。
@Valid
例:
public class Car { private List<@NotNull @Valid Person> passengers = new ArrayList<Person>(); private Map<@Valid Part, List<@Valid Manufacturer>> partManufacturers = new HashMap<>(); //... }