Wiele profili konfiguracji CDI (devel, beta, qa, production) w jednej wojnie?

Mając doświadczenie z aplikacją Spring DIKONTEKST.xml sposób deklarowania iniekcji zależności teraz staram się dowiedzieć, jak zrobić to samo z Java EE6 CDI.

Ze sprężyną mogę wysłać swoje .jar z kilkoma profilami konfiguracji, takimi jak unittest.xml, devel.xml, qa.XML, produkcja.xml i aktywować je za pomocą parametrów wiersza poleceń lub zmiennych środowiskowych.

Z CDI, przydałoby mi się @ Alternative w .xml i właściwości w web.xml ale wydaje się, że nie ma sposobu na wysyłkę wielu fasolek.xml dla różnych środowisk.

Nie chcę używać profili/filtrów Maven do produkcji 4-6 wersji mojej aplikacji, chociaż rozumiem, że w niektórych scenariuszach byłoby to lepsze rozwiązanie (np. wysyłanie gotowych wojen build do klientów - ale używam tylko moich wojen wewnętrznie, więc oszczędzajmy czas kompilacji!)

Najlepiej też bym mógł załadować te pliki konfiguracyjne z systemu plików, aby mogły być edytowane przez sysadmins bez konieczności ponownego budowania aplikacji.

Jaki jest sposób Java EE6 na posiadanie wielu zestawów konfiguracyjnych zależności i właściwości?

Jeśli nie ma, jakie są zalecane alternatywy od 2013 roku? Używasz Wiosny? Seam? Guice? Widziałem wzmianki o Apache DeltaSpike, ale nadal wyglądają na alpha juding ze strony.

Author: lathspell, 2013-06-04

3 answers

Użyłbym dynamicznego producenta, używając Qualifier do identyfikacji pożądanego środowiska

// The qualifier for the production/qa/unit test 
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD,
 ElementType.FIELD, ElementType.PARAMETER})
public @interface Stage {
   String value() default "production";
}

// The interface for the stage-dependant service
public interface Greeting{
    public String sayHello();
}

// The production service
@Stage("production")
public class ProductionGreeting implements Greeting{
    public String sayHello(){return "Hello customer"; }
}

// The QA service
@Stage("qa")
public class QAGreeting implements Greeting{
    public String sayHello(){return "Hello tester"; }
}

// The common code wich uses the service
@Stateless
public class Salutation{
   @Inject Greeting greeting; 
   public String sayHello(){ return greeting.sayHello(); };
}

// The dynamic producer
public class GreetingFactory{
    @Inject
    @Any
    Instance<Greeting> greetings;        

    public String getEnvironment(){
         return System.getProperty("deployenv");
    }

    @Produces
    public Greeting getGreeting(){
        Instance<Greeting> found=greetings.select(
           new StageQualifier(getEnvironment()));
        if (!found.isUnsatisfied() && !found.isAmbiguous()){
           return found.get();
        }
        throw new RuntimeException("Error ...");
    }

    public static class StageQualifier 
      extends AnnotationLiteral<Stage> 
      implements Stage {
       private String value;

       public StageQualifier(String value){
           this.value=value;
       }
       public String value() { return value; }
     }

}

Więc tutaj kontener wstrzykuje wszystkie dostępne implementacje Greeting do GreetingFactory, która z kolei służy jako @Producer dla zamierzonej, opierając decyzję na właściwości systemowej "deployenv".

 9
Author: Carlo Pellegrini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 15:00:24

Powyższa odpowiedź Carlo jest dobra, mamy to wszystko w DeltaSpike z ProjectStage . Warto się temu przyjrzeć, żebyś nie musiał pisać wszystkiego sam.

 2
Author: LightGuard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 15:39:58

Alternatywnym rozwiązaniem jest zaproponowane przez M.-Leandera Reimera w jego prezentacji migracja aplikacji webowej opartej na JSF Z Spring 3 do Java EE 7 i CDI (Slide 32), używając rozszerzenia CDI:

@Alternative
@Stereotype
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ProfileAlternative {
    Profile[] value();
}

public void processAnnotated(@Observes ProcessAnnotatedType<?> event) {
    ProfileAlternative pa = getProfileAlternative(event);
    if (profileAlternativeIsNotActive(pa)) {
        event.veto();
    }
 }

Używa niestandardowej adnotacji @ProfileAlternative naśladującej @Profile Springa i rozszerzenia CDI obserwującego Zdarzenie ProcessAnnotatedType do veto() typu, jeśli jest przypisany do profilu, a profil nie jest aktywny.

 1
Author: Ferdinand Beyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-03 15:37:20