Domanda

Sfondo: Quindi, ho diversi fagioli che interfacciano i sistemi esterni. Per lo sviluppo, è comodo deridere i sistemi esterni e sostituire i fagioli di interfacciamento con alcune implementazioni che producono risposte più o meno statiche. Quindi quello che sto facendo è creare un'interfaccia, l'implementazione reale e un'implementazione stub come questa:

public interface ExternalService {
// ...
}

@Service
public class ExternalServiceImpl implements ExternalService {
// ...
}

@Service
@Primary
@Profile({"stub"})
public class StubExternalService implements ExternalService {
// ...
}
.

... E questo funziona GRANDE: se il profilo dello stub non è presente, il fagiolo stub non viene caricato affatto. Se è presente, si sostituisce bene la vera attuazione a causa dell'annotazione @primary.

Problema: Ora, tuttavia, ho corso per la prima volta in una situazione in cui ho effettivamente due reali implementazioni della stessa interfaccia. Uno di questi è definito come primario, ma l'altro può anche essere utilizzato caricandolo dal contesto dell'applicazione.

Mi piacerebbe ancora creare un servizio di stub per sostituirli entrambi, ma questa volta il mio vecchio modo di definire lo stub come @primary non funziona, perché c'è già un'implementazione primaria. Fondamentalmente ciò di cui avrei bisogno è un modo per non caricare il fagiolo principale quando è impostato il profilo dello stub, ma sono in perdita su come farlo esattamente. Ricerche Web o altre domande di overflow stack Non sembrano aiutare.

È stato utile?

Soluzione

Risulta della risposta è stato sorprendentemente semplice: aggiungi un non operatore (!) davanti al nome del profilo:

@Service
@Primary
@Profile({"!stub"})
public class ExternalServiceImpl implements ExternalService {
// ...
}
.

In questo modo il fagiolo viene caricato solo quando il profilo-profilo stub non è attivo. Il supporto per questa funzione è stato aggiunto in primavera 3.2 m1 .

C'è un avvertimento, però: se scrivi @Profile({"!stub", "foo"}), la virgola viene trattata come "o", non "e". Quindi questo fagiolo di esempio sarebbe attivato se stub non era attivo o se foo era attivo.

Modifica / Aggiungi: Spring 5.1 Aggiunto un supporto per un nuova espressione lingua per profili : !stub & foo è attivato quando stub non è attivo e foo è attivo. Grande successo! Puoi persino mescolare e abbinare AND e ORS a condizione che utilizzi Parentesi: production & (us-east | eu-central).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top