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
import javax.inject.Inject;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import br.com.sandbox.PropertiesResolver;
@ApplicationPath("/api")
public class SandboxApplication extends Application {
@Inject
private PropertiesResolver resolver; // Sempre Nulo
public SandboxApplication() {
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
Estou utilizando Wildfly 10.1.0.Final
Opa, tudo certo?
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.
Ex.:
@PostConstruct
public void init()
{
System.out.println(resolver);
}
Abraço.
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
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?
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.
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.
Segue como ficou a implementação.
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import br.com.sandbox.PropertiesResolver;
@ApplicationScoped
@ApplicationPath("/api")
public class SandboxApplication extends Application {
@Inject
private PropertiesResolver resolver;
@PostConstruct
private init() {
System.out.println("SandboxApplication.SandboxApplication()");
System.out.println("Resolver -> " + resolver);
}
}
@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.
Abraço.