JSR-303 @ अमान्य टिप्पणी बाल वस्तुओं की सूची के लिए काम नहीं कर रही है


95

मेरी मुख्य कक्षाएं हैं

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>

ऑब्जेक्ट फील्ड्स को एड्रेसफ़ॉर्म क्यों मान्य नहीं किया जाता है?

कृपया मदद कीजिए।

जवाबों:


165

आप को सजाने के लिए की जरूरत addressesके सदस्य UserAddressesFormके साथ @Validएनोटेशन। JSR 303: बीन सत्यापन के खंड 3.1.3 और 3.5.1 देखें । जैसा कि मैंने इस प्रश्न के उत्तर में बताया कि क्या एनएसआर 303 बीन सत्यापन को एनोटेट विधि का उपयोग करने के लिए सक्षम करने का एक मानक तरीका है , यह @Validजेएसआर 303 के अनुसार एनोटेशन का वास्तविक उपयोग है ।

उदाहरण कोड संपादित करें : हाइबरनेट सत्यापनकर्ता- ऑब्जेक्ट ग्राफ़ । (कार में यात्रियों की सूची)

हाइबरनेट वैलिडेट 6 संदर्भ डॉक्टर से संपादित करें :

6 से पहले के संस्करणों में, हाइबरनेट वैलिडेटर ने कंटेनर तत्वों के सबसेट के लिए कैस्केड सत्यापन का समर्थन किया था और इसे कंटेनर स्तर पर लागू किया गया था (उदाहरण के लिए आप @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<>();

       //...
   }

यह भी देखें कि बीन सत्यापन 2.0 / जकार्ता बीन सत्यापन में क्या नया है ।


ग्रुपिंग के बारे में क्या? मैं चाहता हूं कि पता तब ही मान्य हो जब समूह A मान्य हो। @Validसमूह की उपेक्षा करता है।
अक्षय

1
@ अक्षय @Validएनोटेशन निचले स्तर पर काम करता है। मुझे लगता है कि सत्यापन आदेश को निर्दिष्ट करने के लिए @GroupSequence का उपयोग किया जा सकता है।
रितेश

मेरे विस्तृत सवाल stackoverflow.com/q/41457404/1534925 । मुझे नहीं लगता कि मेरे मामले में अनुक्रम काम करेगा।
अक्षय

27

@ रीतेश जवाब में जोड़ते हुए, @Validबाधा बीन वैलिडेटर को अपनी लागू संपत्ति के प्रकार को उजागर करने और वहां पाए गए सभी बाधाओं को मान्य करने का निर्देश देगा। अपने प्रश्न के कोड के साथ उत्तर दें, सत्यापनकर्ता, जब संपत्ति @Validपर एक बाधा को देखते हुए addresses, 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

1
ग्रुपिंग के बारे में क्या? मैं चाहता हूं कि पता तब ही मान्य हो जब समूह A मान्य हो। @Valid समूह पर ध्यान नहीं देता
अक्षय

मैंने आपका उत्तर भी नहीं पढ़ा, लेकिन बस setters and gettersअपने मुद्दे को हल किया।
शुभम खंडारे

8

कक्षा में UserAddressesForm निम्नलिखित पंक्तियाँ जोड़ता है

@Valid
private List<AddressForm> addresses;

4

काम करने का उपाय।

public class UserAddressesForm {

    @NotEmpty(message="firstName is required")
    private String firstName;

    @NotEmpty(message="lastNameis required")
    private String lastName;

    @NotNull(message="addresses attributes are required")
    @Valid
    private List<AddressForm> addresses;

...
setters and getters 

public class AddressForm {

    @NotEmpty(message="customNameis required")
    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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.