Сквозные проблемы в 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:

Обновление: я только смог заставить это работать в GlassFish 3.1. Ключ (который не показал ни один из приведенных мною примеров) заключается в том, что вы должны убедиться, что CDI управляет сроком службы ваших экземпляров ресурса (чтобы он мог обернуться перехватчиками). Создание собственного экземпляра, а затем возврат в методе Application.getSingletons() не работает.

Я собираюсь вернуться и посмотреть, смогу ли я получить его и на пристани.

Обновление 2: Jetty (и, возможно, расширение любых других контейнеров сервлетов, отличных от J2EE, таких как Tomcat), является проблемой при настройке CDI. Я думаю, что GlassFish - намного более легкая интеграция. Вот один блог, в котором описаны некоторые шаги, необходимые для Jetty:

Ты можешь использовать ContextResolver провайдер, чтобы предоставить любой контекст для ресурса или другого провайдера. В основном вам нужно реализовать javax.ws.rs.ext.ContextResolver<T> для любого контекста, который вы хотите ввести. Не забудьте аннотировать его @Provider и зарегистрируйтесь.

Другие вопросы по тегам