2013-03-05 8 views
5

के साथ वसंत डिफ़ॉल्ट तारों में मुझे दो सेम मिल गए हैं। दोनों मेलिंग समारोह को लागू करते हैं। एक केवल तभी काम कर रहा है जब इसे किसी एप्लिकेशन सर्वर पर तैनात किया जाता है। दूसरा परीक्षण के लिए प्रयोग किया जाता है।प्रोफाइल

हमारे पास प्रत्येक डेवलपर और पर्यावरण के लिए प्रोफ़ाइल है। वास्तव में परीक्षण करते समय मैं केवल परीक्षण बीन को तार करना चाहता हूं। परीक्षण नहीं करते समय अन्य बीन का इस्तेमाल किया जाना चाहिए। मैं इसे कैसे संग्रहीत कर सकता हूं?

@Component 
@Profile("localtest") 
public class OfflineMail implements Mailing {} 

समाधान दृष्टिकोण:

"डिफ़ॉल्ट" का उपयोग करते हुए मैं इस कहीं पढ़ा है, लेकिन कोई "देव" की तरह एक प्रोफ़ाइल के लिए "डिफ़ॉल्ट" के लिए फॉल-बैक हो रहा है:

@Component 
@Profile("default") 
public class OnlineMail implements Mailing {} 

-> तारों के लिए कोई बीन के लिए अपवाद नहीं मिला।

प्रोफ़ाइल को छोड़कर:

@Component 
public class OnlineMail implements Mailing {} 

-> एक अनूठा अपवाद फेंकता है जब "localtest" प्रोफ़ाइल चल रहा है।

जोड़ा जा रहा है सभी प्रोफाइल:

@Component 
@Profile("prod") 
@Profile("integration") 
@Profile("test") 
@Profile("dev1") 
@Profile("dev2") 
@Profile("dev3") 
... 
public class OnlineMail implements Mailing {} 

यह वास्तव में काम कर रहा है, फिर भी हमारे devs गिने नहीं कर रहे हैं वे "देव <WindowsLogin>" और प्रोफाइल को जोड़ने, एक सेम के लिए काम कर सकते हैं का उपयोग करें, लेकिन एक मिल जाएगा कई बीन्स के लिए इसका उपयोग करते समय परेशानी में क्योंकि यह निश्चित रूप से बदसूरत हो जाता है।

@Profile ("! Localtest") जैसे कुछ का उपयोग करना भी काम नहीं कर रहा है।

क्या कोई भी "कोई विशिष्ट बीन नहीं मिला है" डिफ़ॉल्ट रूप से तार प्राप्त करने के लिए कोई अच्छा तरीका जानता है?

+0

'@ Component'' बिना @ Profile', डिफ़ॉल्ट सेम होने के लिए कुछ भी नहीं वायर्ड है। क्या आपने घटक के नाम को सेट करने के साथ अद्वितीय अपवाद से बचने की कोशिश की है? मेरा मतलब है, '@ कॉम्पोनेंट (" मेल ")' @Profile ("localtest") के साथ 'और इसके बिना? – n1ckolas

उत्तर

5

मुझे अंत में एक आसान समाधान मिला।

ऑनलाइन मेल डिफ़ॉल्ट रूप से केवल वायर्ड होता है।

@Component 
public class OnlineMail implements Mailing {} 

@Primary एनोटेशन ऑफ़लाइन मेल OnlineMail पर पूर्वता लेता है और अद्वितीय अपवाद से बचा जाता है का उपयोग करना।

@Component सार्वजनिक:

interface Talkative { 
    String talk(); 
} 

@Component 
@Profile("dev") 
class Cat implements Talkative { 
     public String talk() { 
     return "Meow."; 
    } 
} 

@Component 
@Profile("prod") 
class Dog implements Talkative { 
    public String talk() { 
     return "Woof!"; 
    } 
} 

इकाई परीक्षण

मुख्य में
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:applicationContex-test.xml"}) 
@ActiveProfiles(value = "dev") 
public class InjectByDevProfileTest 
{ 
    @Autowired 
    Talkative talkative; 

    @Test 
    public void TestTalkative() { 
     String result = talkative.talk(); 
     Assert.assertEquals("Meow.", result); 

    } 
} 

काम करता है() में काम करता है:

@Component 
@Profile("localtest") 
@Primary 
public class OfflineMail implements Mailing {} 
2

इस प्रयास करें:

@Component 
@Profile("production") 
public class OnlineMail implements Mailing {} 

@Component 
@Profile("localtest") 
public class OfflineMail implements Mailing {} 

फिर @ActiveProfiles का उपयोग कर परीक्षण चलाने ("localtest") और डिफ़ॉल्ट प्रोफ़ाइल के रूप में "उत्पादन" का उपयोग कर उत्पादन वातावरण चलाते हैं।

मुझे आशा है कि वसंत ActiveProfilesResolver के अगले संस्करण में SPR-10338 पेश किया जाएगा - यह आपके लिए उपयोगी हो सकता है ("dev1", "dev2" और इससे भी बचने के लिए)।

+0

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

+0

दो प्रकार की प्रोफाइल हैं - डिफ़ॉल्ट <प्रोफाइल और सक्रिय प्रोफाइल, http://stackoverflow.com/questions/10041410/default-profile-in-spring-3-1 –

+0

जांचें तो, डिफ़ॉल्ट उपयोग से बचने के लिए बेहतर है (खाली) किसी भी बीन के लिए वसंत प्रोफ़ाइल जो पहले से ही नकली है - "उत्पादन" और "localtest" प्रोफाइल का उपयोग करें। और प्रारंभ पर चयन करें - सर्वर के लिए @ActiveProfiles का उपयोग करके और 'pring.profiles.default' या'pring.profiles.active 'सर्वर –

0

वसंत बहुत अच्छी तरह से @Profile द्वारा बीन इंजेक्षन का समर्थन करता है कक्षा मुख्य {

डेमो कोड के लिए
 public static void main(String[] args) { 
      // Enable a "dev" profile 
      System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev"); 
      ApplicationContext context = 
        new ClassPathXmlApplicationContext("applicationContext.xml"); 
      Main p = context.getBean(Main.class); 
      p.start(args); 
     } 

     @Autowired 
     private Talkative talkative; 

     private void start(String[] args) { 
      System.out.println(talkative.talk()); 
     } 
    } 

चेक करें: https://github.com/m2land/InjectByProfile

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