Risoluzione di fagioli esterni (3a parte) a saldare
-
20-09-2019 - |
Domanda
So che non è ancora abbastanza popolare, dal momento che le specifiche è stato rilasciato pochi mesi fa.
Non ho "installato" di saldatura ancora, sto solo leggendo, e da questa domanda che vuole assicurarsi che ho capito questo importante punto corretto:
è la risoluzione di fagioli che sono in vasi 3rd-party conseguiti da dichiarandoli come <alternatives>
nella tua beans.xml
?
In caso contrario, come utilizzare i fagioli dalle biblioteche 3rd party che non hanno beans.xml
?
Mettere il vaso sul classpath non funziona a meno che non ci sia beans.xml
nella loro META-INF
, che non si può fare vero per 3rd vasetti di partito. (Vedi post Gavin King sul tema )
Soluzione
perché pensare così complicato?
È sufficiente fare un producerMethod per le classi 3a parte.
Supponiamo di avere una libreria di terze parti che prende automaticamente i file PDF e li invia al Faximile, e vi piace usare qualcosa come
private @Inject PdfFaxService faxService;
nel codice, allora si potrebbe semplicemente fornire questo con un metodo produttore. Il PdfFaxService funziona senza stato, in modo che possiamo tranquillamente supporre che possiamo fare è @ApplicationScoped
:
public @Produces @ApplicationScoped PdfFaxService createFaxService() {
return new PdfFaxService(initparameters);
}
da qualche parte.
hth.
Altri suggerimenti
La mia comprensione di un alternativa è che è un'alternativa a qualche altra implementazione di un'interfaccia che è possibile utilizzare in un ambiente di distribuzione diversa (ad esempio un ambiente di test). Un alternativa di fagioli è dichiarato annotando con @Alternative
.
Per usare un'alternativa in un dato scenario di distribuzione, si seleziona nell'elemento <alternatives>
del CDI descrittore di deployment META-INF/beans.xml
. Ciò consentirà fagioli @Alternative
che sono disabili per impostazione predefinita.
Quando abilitata, se il contenitore rileva una dipendenza ambigua per un dato punto di iniezione, si cerca alternative che possono essere iniettati e, se v'è esattamente un, prendere questa alternativa.
In altre parole, alternative sono un bel modo per sostituire un implementazione esistente con un altro in fase di distribuzione. Se non c'è niente da sostituire, non hai bisogno di alternative, basta mettere il barattolo sul percorso di classe. Non sicuro che questo era esattamente alla tua domanda, però, ho un dubbio sul concetto di vasi 3rd-party.
2.1.4. Alternative , 4.6. Alternative e 4.7. Fissaggio dipendenze non soddisfatte e ambigue (ma credo che questo è quello che stai leggendo).
Aggiornamento:. Per rispondere alla tua domanda aggiuntiva
In caso contrario, come utilizzare i fagioli dalle librerie 3a parte che non hanno beans.xml
Questo non può accadere, un archivio bean deve avere un bean.xml
(sia esso vuoto) come descritto nella sezione 15,6. Packaging e la distribuzione della documentazione:
CDI non definisce alcun speciale archivio di distribuzione. È possibile impacchettare fagioli in JAR, EJB-JAR o WAR-any posizione di distribuzione nella domanda classpath. Tuttavia, l'archivio deve essere un "archivio di fagioli". Ciò significa che ogni archivio che contiene i fagioli devono includere un file chiamato
beans.xml
nellaMETA-INF
directory del percorso di classe o diWEB-INF
directory del web root (per Archivi di guerra). Il file potrebbe essere vuoto. Fagioli distribuiti in archivi che non lo fanno avere un filebeans.xml
non sarà disponibile per l'uso nell'applicazione.
Quindi, per risolvere una dipendenza insoddisfatto e ambiguo, fare riferimento alla sezione 4.7 accennato in precedenza.
Aggiornamento 2: Sembra che usando BeforeBeanDiscovery.addAnnotatedType()
è possibile aggiungere altre classi da prendere in considerazione durante il rilevamento di fagioli. (BeforeBeanDiscovery
è un evento)