Então deve ser isso, já que não encontra uma implementação, não coloca nem null, pois é uma interface.
Então a unica solução que eu penso seria executar o outro construtor, mas nem sei se é possível fazer.
Rafael_Guerreiro
Para poder fazer isso, você deve criar um component factory da sua interface e nela você instancia a implementação e devolve no getInstance.
M
Maiconfz
O problema é que a implementação não vai ser feita por mim e não vai ter como eu saber o nome dela, então não tem como eu instanciar uma coisa que eu nem sei se está lá.
Eu já até consegui solucionar o problema, mas aí o usuário vai ter que criar um CustomProvider para o VRaptor, e registrar a implementação dele para a minha interface, e é o que eu não queria fazer.
Só quero saber mesmo se tem como, se não existir uma implementação, executar outro construtor que não precise daquela dependência.
Rafael_Guerreiro
Isso dá para ser feito… Já que o próprio VRaptor faz algo assim: Se você criar uma implementação de uma das interfaces internas dele e anotar com @Component, ele vai usar a implementação “nova” se não, ele usa a padrão… Se você perceber, a classe Result é uma interface, ou seja, dá para sobrescrever ela.
Infelizmente eu não sei como ele faz isso… Talvez se você escaneasse o projeto procurando pela classe que implementa a interface e está anotada com @Component.
Mas acho que é trabalho desnecessário. O VRaptor deve ter algo já pronto para isso.
Olha só, nesse post, o Lucas afirma que se você tiver várias classes que implementam a sua interface e que estão anotadas com @Component, todas serão injetadas em uma lista.
Olha só, nesse post, o Lucas afirma que se você tiver várias classes que implementam a sua interface e que estão anotadas com @Component, todas serão injetadas em uma lista.
Dei uma olhada, mas tá falando que você tem que receber todas as implementações no construtor. Só que eu não sei quais implementações serão feitas
Rafael_Guerreiro
Eu estive pensando no seguinte:
Você cria um component factory da sua interface e no construtor dele você recebe uma lista de da interface, verifica qual você quer devolver e coloca no getInstance…
O problema é que ela recebe no construtor o que ela mesma vai devolver… Será que isso dá certo?
M
Maiconfz
Rafael Guerreiro:
Eu estive pensando no seguinte:
Você cria um component factory da sua interface e no construtor dele você recebe uma lista de da interface, verifica qual você quer devolver e coloca no getInstance…
O problema é que ela recebe no construtor o que ela mesma vai devolver… Será que isso dá certo?
Vlw Rafael Guerreiro. Funcionou fazendo receber uma lista.
Minha lógica foi: se o objeto que recebi na lista não for da minha classe padrão, então eu uso este objeto.
Rafael_Guerreiro
Eu estava pensando em uma forma diferente…
Tipo, cria um component factory de EAccessConInitialUserAccessDefinitionProvider.
No construtor dele, recebe a List<EAccessConInitialUserAccessDefinitionProvider> e define a instância que será retornada no método getInstance.
Assim, quando você precisar receber EAccessConInitialUserAccessDefinitionProvider em algum construtor, você não precisaria receber uma lista e verificar se é a instancia esperada.
M
Maiconfz
Rafael Guerreiro:
Eu estava pensando em uma forma diferente…
Tipo, cria um component factory de EAccessConInitialUserAccessDefinitionProvider.
No construtor dele, recebe a List<EAccessConInitialUserAccessDefinitionProvider> e define a instância que será retornada no método getInstance.
Assim, quando você precisar receber EAccessConInitialUserAccessDefinitionProvider em algum construtor, você não precisaria receber uma lista e verificar se é a instancia esperada.
Eu tentei fazer isso, mas deu uma exceção lá de referência circular. Não entendi direito.
Rafael_Guerreiro
Era o que eu estava imaginando. Pois o component factory recebe o que ele devolve, então vira bagunça…
Eu te garanto que existe uma forma de fazer isso. Só estamos olhando para o caminho errado.
M
Maiconfz
Olhando o exemplo do Lucas no outro Post, eu acho que eu tenho que criar uma classe.
UserAccessDefinitionProviders anotar com @Component, e criar um método getDefaultProvider(). Nesse método eu vou escolher qual vai ser o padrão. Se o programador não implementar minha interface, então a minha implementação vai ser a padrão. Se ele implementar, então a dele vai ser a padrão.
Vou fazer isso agora para ver se funciona e já respondo.
M
Maiconfz
É isso mesmo.
Olha como ficou agora:
Classe que escolhe o AcceesDefinitionProvider padrão: