[SPRING] JSR-303 @Valid 주석이 하위 객체 목록에 대해 작동하지 않습니다.
SPRINGJSR-303 @Valid 주석이 하위 객체 목록에 대해 작동하지 않습니다.
나의 주요 수업은
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입니까?
도와주세요.
해결법
-
==============================
1.UserAddressesForm의 주소 member를 @Valid 주석으로 꾸며야합니다. JSR 303 : Bean 유효성 검사의 3.1.3 및 3.5.1 절을 참조하십시오. 질문에 대한 내 대답에서 설명했듯이 주석이 달린 메서드를 사용하여 JSR 303 Bean 유효성 검사를 활성화하는 표준 방법이 있습니까? 이는 JSR 303에 따라 @Valid 주석을 실제로 사용하는 것입니다.
UserAddressesForm의 주소 member를 @Valid 주석으로 꾸며야합니다. JSR 303 : Bean 유효성 검사의 3.1.3 및 3.5.1 절을 참조하십시오. 질문에 대한 내 대답에서 설명했듯이 주석이 달린 메서드를 사용하여 JSR 303 Bean 유효성 검사를 활성화하는 표준 방법이 있습니까? 이는 JSR 303에 따라 @Valid 주석을 실제로 사용하는 것입니다.
편집하다 예제 코드 : Hibernate Validator- Object Graph. (승용차 목록)
-
==============================
2.@Ritesh 대답에 @Valid 제약 조건을 추가하면 Bean Validator가 적용된 속성의 유형을 파헤 치고 거기에있는 모든 제약 조건의 유효성을 검사하도록 지시합니다. 주소 속성에 대한 @Valid 제약 조건을 볼 때 질문에 대한 코드와 함께 유효성 검사기가 응답하면 AddressForm 클래스를 탐색하고 내부에서 발견되는 모든 JSR 303 제약 조건을 다음과 같이 확인합니다.
@Ritesh 대답에 @Valid 제약 조건을 추가하면 Bean Validator가 적용된 속성의 유형을 파헤 치고 거기에있는 모든 제약 조건의 유효성을 검사하도록 지시합니다. 주소 속성에 대한 @Valid 제약 조건을 볼 때 질문에 대한 코드와 함께 유효성 검사기가 응답하면 AddressForm 클래스를 탐색하고 내부에서 발견되는 모든 JSR 303 제약 조건을 다음과 같이 확인합니다.
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
-
==============================
3.UserAddressesForm 클래스에 다음 줄을 추가하십시오.
UserAddressesForm 클래스에 다음 줄을 추가하십시오.
@Valid private List<AddressForm> addresses;
from https://stackoverflow.com/questions/5142065/jsr-303-valid-annotation-not-working-for-list-of-child-objects by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 자바 주석 - 코드 단순화 (0) | 2019.02.25 |
---|---|
[SPRING] CXF 클라이언트 : 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다. (0) | 2019.02.25 |
[SPRING] Eclipse가`ehcache '와 동작하도록 설정하는 법 (0) | 2019.02.25 |
[SPRING] @Async가 나를 위해 작동하지 않습니다. (0) | 2019.02.25 |
[SPRING] 봄 부팅에서 ProblemHandler를 ObjectMapper로 설정할 수 없음 (0) | 2019.02.25 |