Beehive controls e Spring: Substituindo a JavaControlFactory em Controls.instantiate()

4 respostas
programaker

Olá!

Estou desenvolvendo uma aplicação utilizando Beehive, mas eu gostaria que o método instantiate de org.apache.beehive.controls.api.bean.Controls criasse uma implementação personalizada de org.apache.beehive.controls.spi.bean.ControlFactory que usa Spring para criar os beans, ao invés de criar a JavaControlFactory padrão.

Para isso, recorri ao recurso de service providers, colocando a minha SpringControlFactory num jar que possui o arquivo /META-INF/services/org.apache.beehive.controls.spi.bean.ControlFactory, que a declara como sendo um provedor para a interface Controlfactory.

O problema é que a aplicação não está reconhecendo o service provider, continuando a usar a JavaControlFactory. Alguém já tentou fazer algo do tipo numa aplicação web, mesmo sem beehive?

Ah, o servidor de aplicação é o WebLogic 10.

4 Respostas

Kenobi

Bom, ao menos que você preencha o properties - controlbindings.properties, ele nunca vai fazer o Binding e sempre irá retornar o JavaControlFactory.

PS: Curiosidade, oq anda fazendo com o Beehive ? Acredito que do fórum somente nós 2 utilizamos, provavelmente você está rodando WLI ou algo do gênero ?

[]'s

My 2 Cents 8)

programaker

Olá!

Na verdade eu sou novo na empresa, este projetinho faz parte dos meus estudos da fase de treinamento, não é um projeto “pra valer” ainda. Como a empresa utiliza Beehive, estou aprendendo a usá-lo e gostando!

Mas aí surgiu este desafio de integrá-lo com o Spring, que já vem me apurrinhando a algum tempo. Vou tentar esta solução do controlbindings.properties, valeu pela dica! :smiley:

Quanto ao WLI não sei dizer, não me deparei com este termo ainda e não sei o que é. Talvez esteja usando, mas de forma inconsciente :lol:

programaker

Bom, nada mudou. Talvez eu tenha feito algo errado, vou explicar como eu procedi…

Criei o arquivo controlbindings.properties na pasta /WEB-INF/classes, com o seguinte conteúdo:
org.apache.beehive.controls.spi.bean.ControlFactory=teste.util.SpringControlFactory

Era só isso mesmo?

Aliás, pelo que andei lendo aqui a respeito, o controlbindinds.properties serve para fornecer implementações para as @ControlInterfaces. A JavaControlFactory utiliza este arquivo internamente, mas eu acho que ele não servirá para substituir a própria.

O método Controls.instantiate() usa a biblioteca commons-discovery para criar a ControlFactory concreta. Se a discovery não achar nada, ele usa a JavaControlFactory mesmo. Aí é que está o problema! Não sei o que fazer para que a discovery enxergue a SpringControlFactory…

Um dos caminhos possiveis é justamente o padrão de SPI, que relatei no primeiro post, mas não está funcionando. Outro é usar o System.setProperty() para dizer ao discovery qual é a factory, mas esta solução foi descartada aqui na empresa (além de também não ter dado certo, muda a mensagem de erro, mas também não acha a SpringControlFactory).

O negócio tá casca grossa! :slight_smile:

Kenobi

programaker:
Bom, nada mudou. Talvez eu tenha feito algo errado, vou explicar como eu procedi…

Criei o arquivo controlbindings.properties na pasta /WEB-INF/classes, com o seguinte conteúdo:
org.apache.beehive.controls.spi.bean.ControlFactory=teste.util.SpringControlFactory

Era só isso mesmo?

Aliás, pelo que andei lendo aqui a respeito, o controlbindinds.properties serve para fornecer implementações para as @ControlInterfaces. A JavaControlFactory utiliza este arquivo internamente, mas eu acho que ele não servirá para substituir a própria.

O método Controls.instantiate() usa a biblioteca commons-discovery para criar a ControlFactory concreta. Se a discovery não achar nada, ele usa a JavaControlFactory mesmo. Aí é que está o problema! Não sei o que fazer para que a discovery enxergue a SpringControlFactory…

Um dos caminhos possiveis é justamente o padrão de SPI, que relatei no primeiro post, mas não está funcionando. Outro é usar o System.setProperty() para dizer ao discovery qual é a factory, mas esta solução foi descartada aqui na empresa (além de também não ter dado certo, muda a mensagem de erro, mas também não acha a SpringControlFactory).

O negócio tá casca grossa! :slight_smile:

Preciso olhar novamente o código dessa parte, até onde tinha olhado dá realmente para fazer bind pelos properties. Como nunca testei, não posso garantir o seu funcionamento.

WLI é WebLogic Integration que faz uso do Beehive como um dos componentes de integração do framework.

Criado 2 de abril de 2008
Ultima resposta 2 de abr. de 2008
Respostas 4
Participantes 2