Marcador de interface Jax-Rs e injeção @Context
Pergunta
Considere o seguinte serviço simples (JAX-RS):
@Path("/example-service")
public interface ExampleService {
@Path("/ping")
@GET
public String ping(String message);
}
Quero definir específicos do JAXRS na interface, em vez da classe, para que eu possa usar a bela estrutura do cliente, ou seja::
ExampleService client = ProxyFactory.create(ExampleService.class, "http://localhost:8080");
Tudo funciona bem, exceto quando eu quero apresentar algumas das injeções de contexto de Restasy, ou seja: @Context. Ingenuamente, considere o seguinte:
@Path("/example-service")
public interface ExampleService {
@Path("/ping")
@GET
public String ping(@Context HttpServletRequest request, String message);
}
Obviamente, isso não faz sentido porque essa injeção @Context é ortogonal e não pertence à interface (além disso, mesmo que eu possa superar a feiura dessa interface da perspectiva do cliente e passar nula, atualmente há um bug que impede isso de trabalhar: Restasy-311)
Como posso usar a marcação da interface JAXRS (e, portanto, aproveitar a estrutura do cliente de Restasy) e acessar injeções ortogonais @Context ao mesmo tempo?
Solução
Como essa pergunta é formulada, isso pode ser facilmente resolvido com uma injeção de campo @Context na implementação. O que complicou essa situação em particular foi o uso da "integração EJB" de Restasy, que recupera a implementação do JNDI. Esta solução ainda não realiza injeções de repouso adicionais na implementação recuperada do contêiner EJB. Tudo isso será mais fácil com a próxima integração JEE6/JAXRS.