복붙노트

[SPRING] JSR-303 @Valid 주석 (중첩 된 객체)이 작동하지 않음

SPRING

JSR-303 @Valid 주석 (중첩 된 객체)이 작동하지 않음

[봄 3.0.5] [Jboss 5.1]

내 주요 수업은

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. ==============================

    1.UserAddressesForm의 주소 member를 @Valid 주석으로 꾸밀 필요가 있습니다. JSR 303 : Bean 유효성 검사의 3.1.3 및 3.5.1 절을 참조하십시오. 질문에 대한 내 대답에서 설명했듯이 주석이 달린 메소드를 사용하여 JSR 303 Bean Validation을 활성화하는 표준 방법이 있는가? 이것은 JSR 303에 따라 @Valid 주석을 실제로 사용하는 것입니다.

    UserAddressesForm의 주소 member를 @Valid 주석으로 꾸밀 필요가 있습니다. JSR 303 : Bean 유효성 검사의 3.1.3 및 3.5.1 절을 참조하십시오. 질문에 대한 내 대답에서 설명했듯이 주석이 달린 메소드를 사용하여 JSR 303 Bean Validation을 활성화하는 표준 방법이 있는가? 이것은 JSR 303에 따라 @Valid 주석을 실제로 사용하는 것입니다.

    편집하다 예제 코드 : Hibernate Validator- Object Graph. (승용차 목록)

  2. ==============================

    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. from https://stackoverflow.com/questions/5142065/jsr-303-valid-annotation-nested-object-not-working by cc-by-sa and MIT license