JSR-303 @有效注释不适用于子对象列表

我的主要课程是

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注释,因为它更具表现力。

例:

public class Car {

private List<@NotNull @Valid Person> passengers = new ArrayList<Person>();

private Map<@Valid Part, List<@Valid Manufacturer>> partManufacturers = new HashMap<>();

//...

}

以上是 JSR-303 @有效注释不适用于子对象列表 的全部内容, 来源链接: utcz.com/qa/419599.html

回到顶部