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.
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".
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.
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.
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