Pergunta

Plano de fundo: Assim, eu tenho vários grãos de interface com sistemas externos.Para o desenvolvimento, é conveniente para simulação de sistemas externos e substituir a interface feijão com algumas implementações que produzem mais ou menos estático respostas.Então, o que eu tenho a fazer é criar uma interface, a implementação real e um stub de implementação como esta:

public interface ExternalService {
// ...
}

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

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

...e isso funciona muito bem:se o perfil de stub não estiver presente, o stub-bean não ficar carregado em tudo.Se ele estiver presente, ele substitui muito bem a real implementação devido a @Primária de anotação.

Problema: Agora, no entanto, eu tenho que correr pela primeira vez em uma situação onde eu realmente tenho duas implementações reais de uma mesma interface.Um deles é definido como primário, mas outras também podem ser usados por carregá-lo a partir do contexto de aplicação.

Eu ainda gostaria de criar um serviço de stub para substituí-los, mas desta vez a minha velha maneira de definir o stub como @Primária não funciona, porque já existe um primário de implementação.Basicamente o que eu preciso é uma forma de não carregar a principal feijão quando o perfil de stub é definir, mas que eu estou com perda sobre como exatamente fazer isso.Pesquisas na Web ou outro Estouro de Pilha perguntas não parece estar ajudando.

Foi útil?

Solução

Acontece que a resposta foi surpreendentemente simples:adicionar um não-operador (!) na frente do nome do perfil:

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

Desta forma, o feijão só é carregado quando o stub-perfil não está ativa.O suporte para esse recurso foi adicionado em Primavera 3.2 M1.

Há uma ressalva, no entanto:se você escrever @Profile({"!stub", "foo"}), a vírgula será tratada como "ou" não "e".Portanto, este exemplo de feijão seria ativado se stub não era ativo ou se foo estava ativo.

Editar/Adicionar: Spring 5.1 adicionado um suporte para um nova linguagem de expressão para perfis: !stub & foo é ativado quando stub não é ativo e foo é ativo.Grande sucesso!Você pode até mesmo misturar e combinar ands e ors, desde que você use parênteses: production & (us-east | eu-central).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top