2015-11-21 10 views
6

@ConfigurationProperties एनोटेशन का उपयोग बीन में गुणों को इंजेक्ट करने के लिए करते समय, स्प्रिंग उन गुणों को सत्यापित करने के लिए कस्टम सत्यापनकर्ता को परिभाषित करने की क्षमता प्रदान करता है।वसंत पर्यावरण में एकाधिक @ कॉन्फिगरेशनप्रॉपर्टीज सत्यापनकर्ता बीन्स

ConfigurationPropertiesBindingPostProcessor निश्चित बीन नाम "configurationPropertiesValidator" और कक्षा org.springframework.validation.Validator का उपयोग करके इस सत्यापनकर्ता को देखता है।

अब मान लें कि मेरे पास मॉड्यूल ए में इसके सत्यापनकर्ता के साथ @ConfigurationProperties है। एक अन्य मॉड्यूल बी में मॉड्यूल ए पर निर्भरता है। मॉड्यूल बी भी अपने @ConfigurationProperties और इसके स्वयं के सत्यापनकर्ता को परिभाषित करता है।

जब ऐप लोड हो जाता है, तो पोस्ट प्रोसेसर इन बीन्स में से केवल एक को चुनता है। यह सत्यापन के दूसरे भाग को अक्षम करता है।

क्या इसका कोई समाधान है? मैं अपने एप्लिकेशन में कॉन्फ़िगरेशन प्रॉपर्टी वैधता दोनों सक्षम कैसे रख सकता हूं?

उत्तर

6

मुझे अभी भी एक ही समस्या का सामना करना पड़ा और एहसास हुआ कि ConfigurationPropertiesBindingPostProcessor सत्यापित करता है कि @ConfigurationProperties के साथ एनोटेटेड कक्षा वैलिडेटर इंटरफ़ेस को लागू करती है। (org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor#determineValidator देखें)

तो समाधान एनोटेट संपत्ति वर्ग के लिए सभी संपत्ति सत्यापन स्थानांतरित करने के लिए है:

import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.stereotype.Component; 
import org.springframework.validation.Errors; 
import org.springframework.validation.ValidationUtils; 
import org.springframework.validation.Validator; 

@ConfigurationProperties("test.properties") 
@Component 
public class TestProperties implements Validator { 

    private String myProp; 

    public String getMyProp() 
    { 
     return myProp; 
    } 

    public void setMyProp(String myProp) 
    { 
     this.myProp = myProp; 
    } 

    public boolean supports(Class<?> clazz) 
    { 
     return clazz == TestProperties.class; 
    } 

    public void validate(Object target, Errors errors) 
    { 
     ValidationUtils.rejectIfEmpty(errors, "myProp", "myProp.empty"); 

     TestProperties properties = (TestProperties) target; 

     if (!"validThing".equals(properties.getMyProp())) { 
      errors.rejectValue("myProp", "Not a valid thing"); 
     } 
    } 
} 
+0

मैं भी सिर्फ महसूस किया कि कि ऐसा करके, डिफ़ॉल्ट 'configurationPropertiesValidator' वापस' Jsr303ValidatorFactory' में बदल जाती है जो इसका मतलब है कि आप अपने कस्टम 'वैलिडेटर' कार्यान्वयन और जेएसआर -303 एनोटेशन दोनों के साथ गुणों को मान्य कर सकते हैं: –

+0

मैं इसे मेरे लिए काम नहीं कर सकता। ऐसा लगता है कि मैं अपने ग्राहक वैलिडेटर को अनदेखा करता हूं – Plog

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