Как ввести зависимость в ресурс Джерси? - PullRequest
2 голосов
/ 04 марта 2012

Я использую Джерси для создания REST API с помощью Grizzly.Я не использую какую-либо инфраструктуру внедрения зависимостей, такую ​​как Google Guice.

Один из ресурсов должен получить данные с карты в ответ на запрос GET.

Я не могу понять, какЯ могу внедрить эту Карту в ресурс, поскольку с Джерси я не контролирую, как инициализируется ресурс.

Я понимаю, что могу просто объявить Карту как статическую, но это выглядит как очень уродливое решение.

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Я в итоге нашел решение, мне нужно создать «Провайдера» следующим образом:

@Provider
public class DBPoolInjectableProvider extends SingletonTypeInjectableProvider<Context, BoneCPDataSource> {

    public DBPoolInjectableProvider() throws SQLException {
        super(BoneCPDataSource.class, APIMain.getDBPool());
    }
}

Как видите, в этом случае мне действительно нужно было получить доступ к пулу соединений с базой данных, но та же идея будет работать для любого другого типа объекта.

Я просто поместил этого провайдера в пакет, который сканируется на Джерси, и он берет его и использует всякий раз, когда видит такой метод в ресурсе Джерси:

public TestResponse testGet(@Context final BoneCPDataSource ds) throws SQLException {
   ...
}

(Лично я думаю, что такого рода «действия на расстоянии» - это анти-паттерн, но у меня это работает сейчас, поэтому я замолчу)

0 голосов
/ 04 марта 2012

Вы можете сделать следующее:

  • Создайте фильтр, который имеет доступ к нужной вам карте.
  • Объявление локальной переменной потока в фильтре
  • Перед обработкой запроса поместите карту в переменную
  • В вашем ресурсе, когда вам нужен доступ к карте, обращайтесь к этой локальной переменной
  • После обработки запроса очистите эту карту.

На самом деле это почти то же самое, что объявлять сеанс для запроса в Hibernate / JPA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...