2013-03-05 11 views
5

Mam dwie fasolki. Obie implementują funkcję mailingu. Jeden działa tylko wtedy, gdy jest wdrożony na serwerze aplikacji. Drugi służy do testowania.Węzłowe domyślne okablowanie z profilem

Mamy profil dla każdego programisty i środowiska. Chcę podłączyć komponent testowy tylko podczas faktycznego testowania. Drugi komponent powinien być używany, gdy nie jest testowany. Jak mogę to zarchiwizować?

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

Rozwiązanie zbliża:

Użycie "default" Czytałem to gdzieś, ale nie wydaje się być nie upadek do tyłu do "default" dla profilu jak "dev":

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

-> Wyjątek braku fasoli dla znalezionego okablowania.

Pozostawienie profil na:

@Component 
public class OnlineMail implements Mailing {} 

-> Zgłasza unikalny wyjątek podczas uruchamiania "localtest" profil.

dodanie wszystkich profili:

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

to rzeczywiście działa, jednak nasi deweloperzy nie są numerowane używają „dev <WindowsLogin>” i dodawania profili, może pracować dla jednego ziarna, ale będzie dostać w kłopoty, gdy używa się go dla kilku fasoli, ponieważ to na pewno staje się brzydkie.

Używanie czegoś podobnego do @Profile ("! Localtest") nie działa tak dobrze.

Czy ktoś wie lepszy sposób, aby uzyskać "drutu domyślnie, jeśli nie znaleziono konkretnej fasoli"?

+0

'@ Component' bez' @ Profile' ma być domyślnym fasola, jeśli nic nie jest przewodowy. Czy próbowałeś uniknąć unikalnego wyjątku przy ustawianiu nazwy komponentu? Mam na myśli '@Component (" mail ")' z '@Profile (" localtest ")' i bez niego? – n1ckolas

Odpowiedz

5

W końcu znalazłem łatwe rozwiązanie.

Poczta internetowa jest domyślnie połączona przewodowo.

@Component 
public class OnlineMail implements Mailing {} 

Używanie @Primary adnotacji poczty w trybie offline ma pierwszeństwo nad OnlineMail i unika unikalnej wyjątek.

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

Spróbuj tego:

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

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

Następnie uruchom testy przy użyciu @ActiveProfiles ("localtest") i uruchomić środowiska spowodowanego produkcji przy użyciu "produkcji" jako DEFAULT profilu.

Mam nadzieję, że w następnej wersji Spring ActiveProfilesResolver zostanie wprowadzona SPR-10338 - może być pomocna (aby uniknąć "dev1", "dev2" i tak dalej).

+0

Nie rozumiem sensu tego rozwiązania. Ustawiamy poprawne środowisko wszędzie tam, gdzie wdrażamy aplikację. Więc wiosna nie powinna załadować domyślnego, czyż nie? I nie jestem pewien, jak oddzielić domyślne dla testowania, ponieważ zasoby produkcyjne będą również w naszym pliku testowym. –

+0

Istnieją dwa typy profili - domyślne

+0

Lepiej więc unikać używania domyślnego (pusty) profil sprężyny dla każdej fasoli, która już ma fałszywe wzory - użyj profili "produkcja" i "test lokalny". A na początek wybierz wymagane - przy użyciu @ActiveProfiles do testu i "pring.profiles.default" lub "pring.profiles.active" dla serwera –

0

Wiosna obsługuje wstrzyknąć Bean przez @Profile bardzo dobrze:

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!"; 
    } 
} 

Works w badanej jednostki

@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); 

    } 
} 

pracuje w main():

@Component publicznego klasa Główna {

 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()); 
     } 
    } 

Sprawdź to dla kodu Demo: https://github.com/m2land/InjectByProfile

Powiązane problemy