Efetuar Inject em um JAX-RS + RestEasy Application
6 respostasResolvido
D
DarkElf
Olá,
Preciso fazer com que o @Inject funcionasse dentro da classe de configuração do RestEasy via javax.ws.rs.core.Application utilizando @ApplicationPath.
Eu não consegui entender porque não efetua a injeção, e até mesmo utlizando EJB é impossível.
Existe algo que pode ser feito?
Exemplo
importjavax.inject.Inject;importjavax.ws.rs.ApplicationPath;importjavax.ws.rs.core.Application;importbr.com.sandbox.PropertiesResolver;@ApplicationPath("/api")publicclassSandboxApplicationextendsApplication{@InjectprivatePropertiesResolverresolver;// Sempre NulopublicSandboxApplication(){System.out.println("SandboxApplication.SandboxApplication()");System.out.println("Resolver -> "+resolver);}}
O PropertiesResolver é um Singleton, nada mais que uma classe para carregar as configurações num arquivo .properties
Cara, até onde sei a injeção da dependência ocorre somente depois de passar pelo construtor da classe onde você tá injetando. No seu caso, dentro do seu construtor o atributo “resolver” ainda vai ser nulo, somente depois da fase de construção do objeto “SandboxApplication” que a injeção vai ser executada.
Tenta adicionar o @PostConstruct e aí sim verificar se o “resolver” possui valor.
Nossa! Nem tinha lembrado do @PostContruct vou fazer o teste depois.
Por hora eu resolvi utilizando um Servlet para executar onde precisava de @Inject
Vlw
igor_ks
Qq vc está usando pra injeção de dependências (EJB, CDI, Spring)? E sua classe PropertiesResolver, tá anotada com alguma coisa pra dizer que ela é uma classe injetável?
D
DarkElf
Estou utilizando CDI e sim a classe está anotada para ser injetável.
A injeção funciona se eu utilizar fora da classe SandboxApplication que é anotada com @ApplicationPath.
@Luan.Lucas
Fazendo um teste rápido o @PostContruct, infelizmente também não é executado.
D
Solucao aceita
DarkElf
Consegui solucionar o problema.
Seguindo a ideia do @Luan.Lucas em utilizar o @PostConstruct num primeiro momento não funcionou, imagino que não há uma integração 100% do CDI com JAX-RS, já que o @PostConstruct nesse caso não era executado.
Mantendo a ideia, decidi anotar a classe SandboxApplication com @ApplicationScope. E agora sim tive o resultado que procurava. Não sei se há algum efeito colateral em utilizar essa anotação junto com @ApplicationPath, mas de qualquer forma funcionou.
@DarkElf Fico feliz que pude pelo menos te ajudar a ter uma ideia para a solução. No mais, mesmo que tenha funcionado dessa forma, seria bom você analisar se nesse caso vale a pena ter um @ApplicationScoped e se isso não vai impactar no teu negócio de alguma forma.