© DrHitch/Shutterstock.com
Shortcuts
CDI

6 Alternatives


Qualifier eignen sich gut zur Auswahl aus mehreren Varianten einer Bean-Implementierung, wobei diese Varianten durchaus gleichzeitig in der Anwendung zur Verfügung stehen. Unterschiedliche Anwendungsteile können somit je nach Einsatzfall die eine oder andere Variante benutzen.

Ein anderes Szenario ist die komplett alternative Nutzung von Implementierungsvarianten. Hier sind zwar auch mehrere Implementierungen eines Dienstes o. ä. in der Anwendung vorhanden, aber nur eine davon ist aktiv. Diese Situation findet man regelmäßig im Testumfeld vor: Ein Teil der Anwendung wird zum Test durch eine andere Implementierung ausgetauscht. Unabhängig von den in diesem Zusammenhang häufig eingesetzten Mock-Frameworks bietet CDI hier Alternatives an.

Wird eine CDI Bean mit @Alternative (javax.enterprise.inject.Alternative) annotiert, ist sie ohne weiteres nicht für Injektionen etc. sichtbar. Damit treten auch keine Konflikte mit anderen Beans mit gleichem Bean Type auf (Listing 6.1).

public class CocktailJdbcRepository
implements CocktailRepository
{

}

@Alternative
public class CocktailMockRepository
implements CocktailRepository
{

}

public class CocktailModel
{
@Inject
private CocktailRepository cocktailRepository;

Listing 6.1: Deklaration einer Alternative

Im Beispiel wird der Instanzvariablen CocktailModel.cocktailRepository ein Objekt des Typs CocktailJdbcRepository zugewiesen. Die Bean CocktailMockRepository ist durch die Annotation inaktiv.

Mithilfe des Deskriptors beans.xml können Alternatives nun aktiviert werden, wobei gleichzeitig die entsprechende bislang aktive Bean deaktiviert wird. Dazu muss die zu aktivierende Klasse voll qualifiziert im Element <alternatives> eingetragen werden (Listing 6.2).

<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>de.gedoplan. … .CocktailMockRepository</class>
</alternatives>

</beans>

Listing 6.2: Aktivierung einer Alternative durch Eintrag der Klasse in „beans.xml“

Im Beispiel würde jetzt die Bean CocktailMockRepository anstelle von CocktailJdbcRepository benutzt.

Shortcuts
CDI

6 Alternatives

Qualifier eignen sich gut zur Auswahl aus mehreren Varianten einer Bean-Implementierung, wobei diese Varianten durchaus gleichzeitig in der Anwendung zur Verfügung stehen. Unterschiedliche Anwendungsteile können somit je nach Einsatzfall die eine oder andere Variante benutzen.

Shortcut Autorenteam


Qualifier eignen sich gut zur Auswahl aus mehreren Varianten einer Bean-Implementierung, wobei diese Varianten durchaus gleichzeitig in der Anwendung zur Verfügung stehen. Unterschiedliche Anwendungsteile können somit je nach Einsatzfall die eine oder andere Variante benutzen.

Ein anderes Szenario ist die komplett alternative Nutzung von Implementierungsvarianten. Hier sind zwar auch mehrere Implementierungen eines Dienstes o. ä. in der Anwendung vorhanden, aber nur eine davon ist aktiv. Diese Situation findet man regelmäßig im Testumfeld vor: Ein Teil der Anwendung wird zum Test durch eine andere Implementierung ausgetauscht. Unabhängig von den in diesem Zusammenhang häufig eingesetzten Mock-Frameworks bietet CDI hier Alternatives an.

Wird eine CDI Bean mit @Alternative (javax.enterprise.inject.Alternative) annotiert, ist sie ohne weiteres nicht für Injektionen etc. sichtbar. Damit treten auch keine Konflikte mit anderen Beans mit gleichem Bean Type auf (Listing 6.1).

public class CocktailJdbcRepository
implements CocktailRepository
{

}

@Alternative
public class CocktailMockRepository
implements CocktailRepository
{

}

public class CocktailModel
{
@Inject
private CocktailRepository cocktailRepository;

Listing 6.1: Deklaration einer Alternative

Im Beispiel wird der Instanzvariablen CocktailModel.cocktailRepository ein Objekt des Typs CocktailJdbcRepository zugewiesen. Die Bean CocktailMockRepository ist durch die Annotation inaktiv.

Mithilfe des Deskriptors beans.xml können Alternatives nun aktiviert werden, wobei gleichzeitig die entsprechende bislang aktive Bean deaktiviert wird. Dazu muss die zu aktivierende Klasse voll qualifiziert im Element <alternatives> eingetragen werden (Listing 6.2).

<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>de.gedoplan. … .CocktailMockRepository</class>
</alternatives>

</beans>

Listing 6.2: Aktivierung einer Alternative durch Eintrag der Klasse in „beans.xml“

Im Beispiel würde jetzt die Bean CocktailMockRepository anstelle von CocktailJdbcRepository benutzt.

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang