Pergunta

Estou procurando um mecanismo em JAX-RS (JSR-311) que me permita destilar algumas das minhas preocupações transversais específicas para meu aplicativo. Por exemplo, meu aplicativo tem determinado contexto que é pesquisado ou criado para cada solicitação. Eu gostaria de poder ter esse tipo de lógica executado em um local centralizado e, de alguma forma, ser anexado ao contexto para ser utilizado por vários recursos para o restante da solicitação. Seria ainda melhor se eu pudesse realizar esses tipos de ações apenas para alguns subconjuntos de URLs.

A injeção padrão que o JAX-RS fornece para segmentos de caminho, cookie, cabeçalho, etc. é ótima, mas e a interpretação personalizada dessas partes? Eu realmente não quero ter que construir isso toda vez que precisar. Prefiro ter uma maneira de especificar como ele é construído e, em seguida, apenas ter o componente de contexto injetado como parte do meu método de recurso.

Existe algum desses ganchos? Posso manipular o modelo de provedores para fazer isso? A propósito, quero permanecer independente da implementação (Jersey, RESTEasy, etc.) pelo maior tempo possível.

Agradecemos antecipadamente por qualquer insight.

Foi útil?

Solução 2

Em algum tipo de reviravolta bizarra, os padrões estão trabalhando juntos (JAX-RS e CDI) de uma maneira maravilhosamente combinável, e a IBM escreveu um tutorial que pode cobrir minha questão específica. Parte de um tutorial maior sobre a combinação de CDI e JAX-RS , este artigo aborda especificamente o uso de decoradores CDI (Java Contexts and Dependency Injection) e interceptores de método para implementar questões transversais em recursos JAX-RS:

Atualização: acabei de fazer isso funcionar no GlassFish 3.1 . A chave (que nenhum dos exemplos que encontrei mostrou) é que você deve certificar-se de que o CDI gerencie a vida útil de suas instâncias de recurso (para que possa ser agrupado com os interceptores). Instanciar-se e retornar ao método Application.getSingletons () não funciona .

Vou voltar e ver se consigo colocá-lo no Jetty também.

Atualização 2: Jetty (e, por extensão, provavelmente qualquer outro contêiner de servlet não J2EE como o Tomcat) é uma espécie de dor de cabeça para configurar o CDI. Acho que o GlassFish é uma integração muito mais fácil. Aqui está um blog que descreve algumas das etapas necessárias para o Jetty:

Outras dicas

Você pode usar o provedor ContextResolver para fornecer qualquer contexto ao recurso ou a outro provedor.Basicamente, você precisa implementar javax.ws.rs.ext.ContextResolver<T> para qualquer contexto que deseja injetar.Não se esqueça de anotar com @Provider e registrar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top