java - मैं संयोजन में दो या दो से अधिक फ़ील्ड कैसे सत्यापित कर सकता हूं?




jpa jpa-2.0 (3)

मैं अपने मॉडल को प्रमाणित करने के लिए जेपीए 2.0 / हाइबरनेट सत्यापन का उपयोग कर रहा हूं। अब मुझे एक ऐसी स्थिति है जहां दो क्षेत्रों के संयोजन को सत्यापित किया जाना चाहिए:

public class MyModel {
    public Integer getValue1() {
        //...
    }
    public String getValue2() {
        //...
    }
}

यदि मॉडल प्राप्त होता है तो मॉडल अमान्य है getValue1() और getValue2() null और अन्यथा वैध हैं।

मैं जेपीए 2.0 / हाइबरनेट के साथ इस तरह के सत्यापन कैसे कर सकता हूं? एक सरल @ @NotNull एनोटेशन के साथ दोनों गेटर्स सत्यापन पास करने के लिए गैर-शून्य होना चाहिए।


आप प्रतिबिंब का उपयोग कर भी कर सकते हैं। यहां वह आलेख है जो प्रतिबिंब का उपयोग करके इसे लागू करने के बारे में बात करता है।

http://dolszewski.com/java/cross-field-validation/


एकाधिक गुण सत्यापन के लिए, आपको कक्षा-स्तर की बाधाओं का उपयोग करना चाहिए। बीन प्रमाणीकरण से चुपके पिक भाग II: कस्टम बाधाएं :

कक्षा स्तर की बाधाएं

आप में से कुछ ने कई गुणों में फैले बाधा को लागू करने की क्षमता, या कई गुणों पर निर्भर बाधा व्यक्त करने की क्षमता के बारे में चिंताओं को व्यक्त किया है। शास्त्रीय उदाहरण पता सत्यापन है। पते में जटिल नियम हैं:

  • एक सड़क का नाम कुछ हद तक मानक है और निश्चित रूप से इसकी लंबाई सीमा होनी चाहिए
  • ज़िप कोड संरचना पूरी तरह से देश पर निर्भर करती है
  • शहर को अक्सर एक ज़िपकोड से सहसंबंधित किया जा सकता है और कुछ त्रुटि जांच की जा सकती है (बशर्ते कि एक सत्यापन सेवा सुलभ हो)
  • इन परस्पर निर्भरताओं की वजह से एक साधारण संपत्ति स्तर की बाधा बिल फिट करने के लिए होती है

बीन सत्यापन विनिर्देश द्वारा प्रस्तावित समाधान दो गुना है:

  • यह समूहों और समूह अनुक्रमों के उपयोग के माध्यम से बाधाओं के एक दूसरे सेट से पहले लागू होने वाली बाधाओं के एक सेट को मजबूर करने की क्षमता प्रदान करता है। यह विषय अगले ब्लॉग एंट्री में शामिल होगा
  • यह कक्षा स्तर की बाधाओं को परिभाषित करने की अनुमति देता है

कक्षा स्तर की बाधाएं नियमित बाधाएं हैं (एनोटेशन / कार्यान्वयन जोड़ी) जो किसी संपत्ति के बजाय कक्षा पर लागू होती हैं। अलग-अलग कहा गया है, कक्षा-स्तर की बाधाएं isValid उदाहरण (संपत्ति मूल्य के बजाय) प्राप्त isValid

@Address 
public class Address {
    @NotNull @Max(50) private String street1;
    @Max(50) private String street2;
    @Max(10) @NotNull private String zipCode;
    @Max(20) @NotNull String city;
    @NotNull private Country country;

    ...
}

@Constraint(validatedBy = MultiCountryAddressValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Address {
    String message() default "{error.address}";
    String[] groups() default {};
}

public class MultiCountryAddressValidator implements ConstraintValidator<Address> {
    public void initialize(Address constraintAnnotation) {
    // initialize the zipcode/city/country correlation service
    }

    /**
     * Validate zipcode and city depending on the country
     */
    public boolean isValid(Object object) {
        if (!(object instanceof Address)) {
            throw new IllegalArgumentException("@Address only applies to Address");
        }
        Address address = (Address) object;
        Country country = address.getCountry();
        if (country.getISO2() == "FR") {
            // check address.getZipCode() structure for France (5 numbers)
            // check zipcode and city correlation (calling an external service?)
            return isValid;
        } else if (country.getISO2() == "GR") {
            // check address.getZipCode() structure for Greece
            // no zipcode / city correlation available at the moment
            return isValid;
        }
        // ...
    }
}

उन्नत पता सत्यापन नियमों को पता ऑब्जेक्ट से बाहर कर दिया गया है और MultiCountryAddressValidator द्वारा कार्यान्वित किया MultiCountryAddressValidator । ऑब्जेक्ट इंस्टेंस को एक्सेस करके, क्लास लेवल बाधाओं में बहुत लचीलापन होता है और कई सहसंबंधित गुणों को मान्य कर सकता है। ध्यान दें कि ऑर्डरिंग समीकरण से बाहर है, हम अगले पोस्ट में वापस आ जाएंगे।

विशेषज्ञ समूह ने कई एकाधिक गुण समर्थन दृष्टिकोणों पर चर्चा की है: हमें लगता है कि वर्ग स्तर की बाधा दृष्टिकोण निर्भरता से जुड़े अन्य संपत्ति स्तर दृष्टिकोणों की तुलना में पर्याप्त सादगी और लचीलापन दोनों प्रदान करता है। आपकी प्रतिक्रिया का स्वागत है।


बीन सत्यापन के साथ ठीक से काम करने के लिए, पास्कल थिवेंट के answer में प्रदान किया गया उदाहरण निम्नानुसार लिखा जा सकता है:

@ValidAddress
public class Address {

    @NotNull
    @Size(max = 50)
    private String street1;

    @Size(max = 50)
    private String street2;

    @NotNull
    @Size(max = 10)
    private String zipCode;

    @NotNull
    @Size(max = 20)
    private String city;

    @Valid
    @NotNull
    private Country country;

    // Getters and setters
}
public class Country {

    @NotNull
    @Size(min = 2, max = 2)
    private String iso2;

    // Getters and setters
}
@Documented
@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = { MultiCountryAddressValidator.class })
public @interface ValidAddress {

    String message() default "{com.example.validation.ValidAddress.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
public class MultiCountryAddressValidator 
       implements ConstraintValidator<ValidAddress, Address> {

    public void initialize(ValidateAddress constraintAnnotation) {

    }

    @Override
    public boolean isValid(Address address, 
                           ConstraintValidatorContext constraintValidatorContext) {

        Country country = address.getCountry();
        if (country == null || country.getIso2() == null || address.getZipCode() == null) {
            return true;
        }

        switch (country.getIso2()) {
            case "FR":
                return // Check if address.getZipCode() is valid for France
            case "GR":
                return // Check if address.getZipCode() is valid for Greece
            default:
                return true;
        }
    }
}




bean-validation