2014-05-16 5 views
6

मैंने कस्टम ConstraintValidator द्वारा कार्यान्वित एक सत्यापन एनोटेशन लिखा है। मैं भी बहुत विशिष्ट ConstraintViolation ऑब्जेक्ट्स उत्पन्न करना चाहता हूं जो संदेश इंटरपोलेशन के दौरान सत्यापन प्रक्रिया के दौरान गणना मानों का उपयोग करते हैं।बिल्डिंग गतिशील रोकथाम उल्लंघन संदेश

public class CustomValidator 
    implements ConstraintValidator<CustomAnnotation, ValidatedType> { 

... 
    @Override 
    public boolean isValid(ValidatedType value, ConstraintValidatorContext context) { 
    // Figure out that the value is not valid. 
    // Now, I want to add a violation whose error message requires arguments. 
    } 
} 

मेरा संदेश स्रोत में एक काल्पनिक त्रुटि संदेश:

CustomAnnotation.notValid = The supplied value {value} was not valid because {reason}. 

संदर्भ isValid विधि में पारित एक बाधा उल्लंघन का निर्माण, और अंत में संदर्भ में जोड़ने के लिए एक इंटरफेस प्रदान करता है। हालांकि, मुझे यह पता लगाना प्रतीत नहीं होता कि इसका उपयोग कैसे किया जाए। मेरे द्वारा उपयोग किए जा रहे संस्करण के लिए इस documention के अनुसार, मैं उल्लंघन के लिए बीन और प्रॉपर्टी नोड्स जोड़ सकता हूं। ये एकमात्र अतिरिक्त विवरण हैं जिन्हें मैं उल्लंघन परिभाषा में निर्दिष्ट कर सकता हूं, लेकिन मुझे समझ में नहीं आता कि वे त्रुटि संदेश में पैरामीटर को कैसे मैप कर सकते हैं।

मिलियन डॉलर का प्रश्न: मैं कस्टम सत्यापनकर्ता का उपयोग करके अपने सत्यापन त्रुटि संदेशों में गतिशील पैरामीटर कैसे पास कर सकता हूं? उल्लंघन के निर्माण के लिए ConstraintValidatorContext के इंटरफ़ेस का उपयोग करके मैं {value} और {reason} फ़ील्ड भरना चाहता हूं।

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

उत्तर

10

मानकीकृत बीन वैलीएशन एपीआई के साथ यह संभव नहीं है, लेकिन बीवी संदर्भ कार्यान्वयन, हाइबरनेट वैलिडेटर में एक तरीका है।

आप एक HibernateConstraintValidatorContext जो आप addExpressionVariable() विधि तक पहुँच देता में ConstraintValidatorContext खोलने की जरूरत है:

public class MyFutureValidator implements ConstraintValidator<Future, Date> { 

    public void initialize(Future constraintAnnotation) {} 

    public boolean isValid(Date value, ConstraintValidatorContext context) { 
     Date now = GregorianCalendar.getInstance().getTime(); 

     if (value.before(now)) { 
      HibernateConstraintValidatorContext hibernateContext = 
       context.unwrap(HibernateConstraintValidatorContext.class); 

      hibernateContext.disableDefaultConstraintViolation(); 
      hibernateContext.addExpressionVariable("now", now) 
       .buildConstraintViolationWithTemplate("Must be after ${now}") 
       .addConstraintViolation(); 

      return false; 
     } 

     return true; 
    } 
} 

संदर्भ गाइड कुछ more details है।

+1

रिकॉर्ड के लिए, मैंने यह जवाब स्वीकार कर लिया क्योंकि आपने कहा था कि यह संभव नहीं है। दस्तावेज़ीकरण से उदाहरण वास्तव में मेरे लिए काम नहीं किया क्योंकि मेरा बाधा उल्लंघन टेम्पलेट स्वयं संदेश कोड हैं, और मैं अंतिम संदेश में कस्टम "अभिव्यक्ति चर" तक पहुंचने में असमर्थ था। (त्रुटि संदेश हमेशा था कि कोड हल नहीं किया जा सका।) – Misha

संबंधित मुद्दे