Efetuar Inject em um JAX-RS + RestEasy Application

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.