Сквозные проблемы в JAX-RS
Я ищу механизм в JAX-RS (JSR-311), который позволил бы мне разобраться в некоторых сквозных проблемах, характерных для моего приложения. Например, мое приложение имеет определенный контекст, который ищется или создается для каждого запроса. Мне бы хотелось, чтобы логика этого типа выполнялась в централизованном месте, а затем каким-то образом была привязана к контексту, который будет использоваться различными ресурсами для оставшейся части запроса. Было бы еще лучше, если бы я мог выполнять эти типы действий только для некоторых подмножеств URL.
Инъекция по умолчанию, которую JAX-RS обеспечивает для сегментов пути, cookie, заголовка и т. Д., Хороша, но как насчет пользовательской интерпретации этих частей? Я действительно не хочу создавать это каждый раз, когда мне это нужно. Я предпочел бы указать способ его построения, а затем просто вставить компонент контекста как часть моего метода ресурса.
Существуют ли такие крючки? Могу ли я манипулировать моделью провайдеров, чтобы сделать это? Кстати, я хочу оставаться независимым от реализации (Джерси, RESTEasy и т. Д.) Как можно дольше.
Заранее спасибо за любые идеи.
2 ответа
В некотором неординарном повороте стандарты работают вместе (JAX-RS и CDI) чудесным образом сочетаемым образом, и IBM написала учебник, который может охватить мой конкретный вопрос. Эта статья, являющаяся частью большого руководства по объединению CDI и JAX-RS, специально посвящена использованию декораторов и перехватчиков методов CDI (Java Contextxts и Dependency Injection) для реализации сквозных задач в ресурсах JAX-RS:
- Реализация ресурса JAX-RS с декораторами и перехватчиками методов
- Общий пример CDI, а затем применяется к JAX-RS
Обновление: я только смог заставить это работать в GlassFish 3.1. Ключ (который не показал ни один из приведенных мною примеров) заключается в том, что вы должны убедиться, что CDI управляет сроком службы ваших экземпляров ресурса (чтобы он мог обернуться перехватчиками). Создание собственного экземпляра, а затем возврат в методе Application.getSingletons() не работает.
Я собираюсь вернуться и посмотреть, смогу ли я получить его и на пристани.
Обновление 2: Jetty (и, возможно, расширение любых других контейнеров сервлетов, отличных от J2EE, таких как Tomcat), является проблемой при настройке CDI. Я думаю, что GlassFish - намного более легкая интеграция. Вот один блог, в котором описаны некоторые шаги, необходимые для Jetty:
Ты можешь использовать ContextResolver
провайдер, чтобы предоставить любой контекст для ресурса или другого провайдера. В основном вам нужно реализовать javax.ws.rs.ext.ContextResolver<T>
для любого контекста, который вы хотите ввести. Не забудьте аннотировать его @Provider
и зарегистрируйтесь.