java बहु ग्रैडल प्रोजेक्ट में ज्यूनेट स्प्रिंग प्रसंग में संसाधन गुणों को कैसे लोड करें?



spring spring-mvc (1)

मेरे पास निम्नलिखित परियोजना का पेड़ है:

├── app
   ├── build.gradle
   └── src
       ├── main
          ├── java
             └── child
                 └── app
                     └── Application.java
          └── resources
              └── application-default.yaml
       └── test
           └── java
               └── child
                   └── app
                       └── ApplicationTest.java
├── build.gradle
├── childA
   ├── build.gradle
   └── src
       └── main
           └── java
               └── child
                   └── a
                       ├── BaseGreeterImpl.java
                       ├── ChildAConfig.java
                       ├── Greeter.java
                       └── MySpringProperties.java
├── childB
   ├── build.gradle
   └── src
       └── main
           └── resources
               ├── application-test.yaml
               └── childB.properties
├── childC
   ├── build.gradle
   └── src
       ├── main
          ├── java
             └── child
                 └── c
                     ├── ChildCConfig.java
                     └── PropertyGreeterImpl.java
          └── resources
              └── childc.properties
       └── test
           └── java
               └── child
                   └── c
                       ├── TestYamlImport.java
                       └── TestGreeter.java
└── settings.gradle

मेरे पास निम्नलिखित टेस्ट क्लास है:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ChildCConfig.class }, loader = AnnotationConfigContextLoader.class)
@ActiveProfiles("test")
@SpringBootTest
public class TestYamlImport {

    @Autowired
    private MySpringProperties properties;

    @Test
    public void readChildAYaml() {
        assertThat(properties.getName()).isEqualTo("it-is-another-thing");
    }

}

अपेक्षित होना

मुझे उम्मीद है कि properties.getName() childB / src / main / resources / application-test.yaml में संसाधन childB से मान को पढ़ने के लिए।

परिणाम

मैं null मिलता है

प्रजनन

गीथहब: https://github.com/kopax/adk/tree/adk-spring

एक लाइन:

git clone [email protected].com:kopax/adk.git && cd adk && git checkout adk-spring && ./gradlew build --info

सवाल

बाल परीक्षण / सीआरसीसी / टेस्ट / जावा / चाइल्ड सी / टेस्टग्रीेटर.जावा नामक एक परीक्षा है जिसमें प्रजनन परियोजना में पाया गया है जो कि childB.properties साथ साबित होता है कि यह एक क्लासपाथ समस्या नहीं है

तो मेरे सवाल हैं:

  • वसंत में किसी प्रकार का @ConfigurationProperties का उपयोग करते समय क्लासपाथ रिजोल्यूशन सीमित है?

  • मेरे application-test.yml को application-test.yml के परीक्षण के दायरे से शुरू किए @Bean एक विन्यास @Bean आरम्भ करने का कोई तरीका नहीं मिला है, यह कैसे संभव है?


क्या कोई विशेष कारण है कि आप SpringBootContextLoader (डिफ़ॉल्ट) के बजाय SpringBootContextLoader का उपयोग कर रहे हैं? आप जिस समस्या का सामना कर रहे हैं, वह क्लासपाथ में अनुपलब्ध फाइल के कारण नहीं है (आप एक ही परिणाम के साथ किसी भी src/main/resources या src/test/resources application-test.yaml कॉपी कर सकते हैं), लेकिन तथ्य यह है कि ConfigFileApplicationListener उपयोग नहीं करता है जो प्रसिद्ध फाइल स्थानों (जैसे application-{profile}.yaml आपके मामले में लोड होने से गुणों को लोड करके संदर्भ को कॉन्फ़िगर करने के लिए ज़िम्मेदार है।

प्रत्येक लोडर का उपयोग करते समय आप आसानी से क्या गुण लोड कर सकते हैं इसकी तुलना कर सकते हैं सबसे पहले आप यह जांच सकते हैं कि AnnotationConfigContextLoader क्या करता है - बस एब्जेक्ट जेनरिक कन्टेक्सलोडर.जावा फ़ाइल की रेखा 128 पर ब्रेकपॉइंट डाल कर अपने पसंदीदा आईडीई में डीबगर चलाएं:

इसके बाद आप चर context जांच कर सकते हैं -> environment -> propertySources - propertySources -> propertySourceList आप 5 संपत्ति स्रोत पाएंगे:

उनमें से कोई भी कॉन्फ़िग फाइल्स जैसे application.yml । यम या application.properties से गुण लोड करता है।

अब चलो ऐसा ही करते हैं लेकिन SpringBootContextLoader वर्ग के साथ। सबसे पहले निकालें

loader = AnnotationConfigContextLoader.class

MyEntityTest और SpringApplication.java फ़ाइल में पंक्ति 303 पर एक ब्रेकपॉइंट डाल:

यहां हम आवेदन संदर्भ रिफ्रेश होने से पहले सही हैं। अब चलिए वैरिएबल context -> environment -> propertySources context की जांच करते propertySources - propertySourceList :

हम पहले अंतर देख सकते हैं कि अब हमारे पास 5 की बजाय 7 संपत्ति स्रोत हैं, जैसा कि पिछले उदाहरण में था। और सबसे महत्वपूर्ण क्या है - ConfigFileApplicationListener.ConfigurationPropertySources यहाँ है यह क्लास अनुप्रयोग संदर्भ से परिचित होता application-{profile}.yaml गुण फ़ाइल अस्तित्व।

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

@ContextConfiguration(classes = { ChildCConfig.class }, loader = AnnotationConfigContextLoader.class)

साथ में

@ContextConfiguration(classes = { ChildCConfig.class }, loader = SpringBootContextLoader.class)

या

@ContextConfiguration(classes = { ChildCConfig.class })

जैसा कि यह लोडर एक डिफ़ॉल्ट है जब @SpringBootTest एनोटेशन का उपयोग करते हुए और आप अपना परीक्षण एक आकर्षण की तरह गुजारें। मुझे उम्मीद है यह मदद करेगा।