Pergunta

Eu sei que ainda não é muito popular, já que a especificação foi lançada há apenas alguns meses.

Ainda não "instalei" a solda, estou apenas lendo e, com esta pergunta, quero ter certeza de que entendi esse ponto importante correto:

É a resolução de feijões que estão em frascos de terceiros alcançados por declará-los como <alternatives> na tua beans.xml?

Caso contrário, como usar feijão de bibliotecas de terceiros que não têm beans.xml ?

Colocar o pote no caminho de classe não funcionará a menos que haja beans.xml em seus META-INF, que você não pode tornar verdadeiro para potes de terceiros. (Vejo Post de Gavin King sobre o assunto)

Foi útil?

Solução

Por que pensar tão complicado?

Simplesmente faça um produtor para essas aulas de terceiros.

Vamos supor que você tenha uma biblioteca de terceiros que leva automaticamente arquivos PDF e os envia por faximile, e você gosta de usar algo como

private @Inject PdfFaxService faxService;

No seu código, você pode simplesmente fornecer isso com um método de produtor. O PDFFFAXSERVICE funciona sem estado, para que possamos assumir com segurança que podemos fazê -lo @ApplicationScoped:

public @Produces @ApplicationScoped PdfFaxService createFaxService() {
  return new PdfFaxService(initparameters);
}

em algum lugar.

hth.

Outras dicas

Minha compreensão de um alternativo é que é uma alternativa a outra implementação de uma interface que você pode usar em um ambiente de implantação diferente (por exemplo, um ambiente de teste). Um alternativo Bean é declarado anotando -o com @Alternative.

Para usar uma alternativa em um determinado cenário de implantação, você o seleciona no <alternatives> Elemento do seu descritor de implantação do CDI META-INF/beans.xml. Isso permitirá @Alternative feijões que são desativados por padrão.

Quando ativado, se o contêiner encontrar uma dependência ambígua para um determinado ponto de injeção, ele analisará alternativas que poderão ser injetadas e, se houver exatamente uma, pegue essa alternativa.

Em outras palavras, alternativas são uma boa maneira de substituir um implementação existente com outro no tempo de implantação. Se não houver nada a substituir, você não precisa de alternativas, basta colocar seu frasco no caminho da classe. Não tenho certeza se essa foi exatamente a sua pergunta, tenho uma dúvida sobre o conceito de potes de terceiros.

Mais em 2.1.4. Alternativas, 4.6. Alternativas e 4.7. Corrigindo dependências insatisfeitas e ambíguas (Mas acho que é isso que você está lendo).

Atualizar: Para responder sua pergunta adicional.

Caso contrário, como usar feijão de bibliotecas de terceiros que não têm beans.xml

Isso não pode acontecer, um arquivo de feijão deve ter um bean.xml (seja vazio) conforme detalhado na seção 15.6. Embalagem e implantação da documentação:

O CDI não define nenhum arquivo de implantação especial. Você pode embalar feijões em frascos, ejb-jars ou guerras-qualquer localização de implantação no Application ClassPath. No entanto, o arquivo devoSeja um "arquivo de feijão". Isso significa que cada arquivo que contém feijão deve incluir um arquivo nomeado beans.xml no META-INF Diretório do Path de classe ou WEB-INF Diretório da raiz da web (para arquivos de guerra). O arquivo pode estar vazio. Feijões implantados em arquivos que não têm um beans.xml O arquivo não estará disponível para uso no aplicativo.

Em seguida, para corrigir uma dependência insatisfeita e ambígua, consulte a Seção 4.7 mencionada anteriormente.

Atualização 2: Parece que usar BeforeBeanDiscovery.addAnnotatedType() É possível adicionar outras classes a serem levadas em consideração durante a descoberta do feijão. (BeforeBeanDiscovery é um evento)

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