জেএসআর -303 @ ভালি টীকা শিশু অবজেক্টের তালিকার জন্য কাজ করছে না


96

আমার প্রধান ক্লাস হয়

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

একটি জেএসপি পৃষ্ঠা

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

কেন অবজেক্ট ক্ষেত্রগুলি অ্যাড্রেসফর্মটি বৈধ নয়?

সাহায্য করুন.

উত্তর:


168

আপনাকে টীকা সহ addressesসদস্য সাজাতে হবে। জেএসআর 303 এর বিভাগ 3.1.3 এবং 3.5.1 দেখুন : বিনের বৈধকরণ । আমি যেমন প্রশ্নের উত্তরটিতে ব্যাখ্যা করেছি যে টীকাযুক্ত পদ্ধতি ব্যবহার করে জেএসআর 303 শিম বৈধকরণ সক্ষম করার কোনও মানক উপায় আছে , এটি জেএসআর 303 অনুযায়ী টীকাটির আসল ব্যবহার ।UserAddressesForm@Valid@Valid

উদাহরণ কোড সম্পাদনা করুন : হাইবারনেট ভ্যালিডেটর-অবজেক্ট গ্রাফ । (গাড়ীতে যাত্রীদের তালিকা)

হাইবারনেট ভ্যালিডেটর 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<>();

       //...
   }

শিমের বৈধকরণ ২.০ / জাকার্তা বিন বৈধকরণে নতুন কী রয়েছে তা দেখুন ।


গ্রুপিং সম্পর্কে কী? আমি চাই যখন গ্রুপ এ বৈধ হবে তখনই ঠিকানাটি বৈধ করা উচিত be @Validদলটিকে উপেক্ষা করে।
অক্ষয়

4
@ অক্ষয় @Validটীকাগুলি নিম্ন স্তরে কাজ করে। আমি মনে করি @ গ্রুপসেকেন্সটি বৈধতা ক্রম নির্দিষ্ট করার জন্য ব্যবহার করা যেতে পারে।
রীতেশ

আমার বিস্তারিত প্রশ্ন 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

4
গ্রুপিং সম্পর্কে কী? আমি চাই যখন গ্রুপ এ বৈধ হবে তখনই ঠিকানাটি বৈধ করা উচিত be @ ভালিদ দলটিকে উপেক্ষা করে
অক্ষয়

আমি আপনার উত্তরটি পড়িনি তবে কেবল setters and gettersআমার সমস্যাটির সমাধানের দিকে তাকিয়ে আছি।
শুভম খান্ডারে


5

কাজ সমাধান।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.