[Vraptor + Spring] Dois beans implementando a mesma interface, tem como?

Bom dia, amigos.

Gostaria de uma ajuda com esse problema, por gentileza.

O cenário é: tenho uma interface e duas implementações, ambas anotadas com @Component do VRaptor. Minha idéia era fazer um decorator com elas, assim:

public interface Interface {
   public void metodo();
}

@Component
public class ComponentA implements Interface {
      
     private final ComponentB b;

     public ComponentA(ComponentB b){
          this.b = b;
     }
     ...
}

@Component
public class ComponentB implements Interface {
     
     ...
}

@Component
public class ComponentCliente {
    
     //nessa classe seria injetado o componentA, que por sua vez encapsula o componentB

     private final Interface i;

     public class ComponentClient(Interface i) {
          this.i = i;
     }
}

Ocorre que ao tentar realizar a injeção, o Spring avisa que há dois beans do tipo Interface. Isso faz sentido mesmo.

Tentei anotar o ComponentA com @Primary, mas não rolou também. Na verdade vendo o fonte, o VRaptor não considera essa anotação e também o uso dela não é repassado para o Spring, e o VRaptor marca ambos os beans como “primary=true”. Na verdade isso faz sentido também, pra podermos sobrescrever os componentes padrão do Vraptor…

Uma solução que muito provavelmente funcionará é configurar esses beans no xml do Spring mesmo, mas pessoalmente gosto de manter todos os beans com o @Component do VRaptor. Será que haveria algum jeito de fazer o cenário acima dar certo?

Obrigado!

Uma das coisas que vc pode fazer é declarar esses dois componentes no spring, com as anotações do Spring…

vc precisa de um applicationContext.xml no classpath com o component scan habilitado. Deve funcionar tudo bem.

[quote=Lucas Cavalcanti]Uma das coisas que vc pode fazer é declarar esses dois componentes no spring, com as anotações do Spring…

vc precisa de um applicationContext.xml no classpath com o component scan habilitado. Deve funcionar tudo bem.[/quote]

Oi lucas, valeu, eu segui essa abordagem mesmo e funcionou, embora eu preferisse manter mesmo o @Component do Vraptor. Mas, como não rola mesmo, por hoje o importante é funcionar :slight_smile:

Dei uma pesquisada no CDI e me pareceu que as anotações @Decorator e @Delegate fazem exatamente isso que eu queria fazer; na próxima versão do VRaptor eu refatoro de novo hehe.

Valeu, obrigado.

o plugin do CDI já está em beta =)

[quote=Lucas Cavalcanti]o plugin do CDI já está em beta =)

https://github.com/caelum/vraptor-cdi-provider[/quote]

hmm, essa abordagem @Decorator + @Delegate seria excelente pra adicionar comportamento ao aos componentes padrão do VRaptor, não? Valeu lucas, vou testar o plugin e dar umas cabeçadas aqui com ele, valeu!

sim, seria bem legal!

só não é tão fácil de configurar no spring ou no guice… no pico nem rola provavelmente.

Abre lá uma issue pra gente tentar colocar algo parecido =)