(VRaptor) ComponentFactory @RequestScoped, e beans @ApplicationScoped

4 respostas
alias

Olá amigos,

Por gentileza, se possível, gostaria de algumas idéias sobre um problema aqui, pois creio que não achei a melhor forma de solucionar a questão.

Tenho uma interface e duas implementações, ambas anotadas com @Component e @ApplicationScoped.

Em outra classe, preciso de uma dessas implementações dependendo de um parâmetro da requisição. Minha idéia foi criar um ComponentFactory com @RequestScoped, e lá meter um if e retornar o cara adequado.

Essa abordagem não funcionou, pois no momento da injeção o Spring informou que há tres tipos daquela interface no contexto (as duas implementações e a fábrica). O erro do Spring faz sentido, mas não estou percebendo se há algum problema nessa minha modelagem…

Por enquanto deixei as duas implementações como @Request e estou criando-as dentro da factory, mas quero que esses caras tenham escopo de contexto (não preciso cria-los a cada request e sim usá-los a cada request). Mas se nao vou poder declará-los como @Component, pra nao conflitar com a fábrica, onde posso manter a instancia desses caras? Em um bom e velho Singleton? :lol:

Bem, agradeço a ajuda de todos.

Obrigado!

4 Respostas

sergiolopes

Se sao caras ApplicationScoped, eu criaria duas instâncias estáticas dentro da factory mesmo e pronto. Mais fácil e resolve o problema.

Realmente não vai rolar colocar @Component neles…

(uma alternativa seria mexer com qualifiers, mas eu sinceramente prefiro a sua abordagem da factory RequestScoped; fica mais fácil de usar)

alias

Sergio Lopes:
Se sao caras ApplicationScoped, eu criaria duas instâncias estáticas dentro da factory mesmo e pronto. Mais fácil e resolve o problema.

Realmente não vai rolar colocar @Component neles…

(uma alternativa seria mexer com qualifiers, mas eu sinceramente prefiro a sua abordagem da factory RequestScoped; fica mais fácil de usar)

Valeu Sérgio, obrigado. Pois é, estou refatorando aqui pra manter as instancias (estaticas) dentro da factory, como comentou. É que, bom, eu não queria fazer assim :oops: :lol: , fazia algum tempo que eu nao mantinha um cara estatico e fazia um ifzao pra ver se está nulo, se não instancia…um classico!

Lucas_Cavalcanti

nao precisa ser estático, pode ser dois atributos normais num componente @ApplicationScoped, inicializados no construtor ou num @PostConstruct.

alias

verdade lucas, acho que assim ia ficar mais legal…um componente @ApplicationScoped que conheça as implementaçoes e que é injetado dentro da fabrica, aí a fábrica pode retornar a implementaçao adequada dependendo do parametro do request…bacana! vou fazer e ver o que sai…

alterei o codigo pra que essas implementaçoes sejam Singleton (urgh), não tá muito bonito nao hehe

valeu!

Criado 26 de dezembro de 2012
Ultima resposta 27 de dez. de 2012
Respostas 4
Participantes 3