2014-01-15 2 views
1

Я пытаюсь инициализировать некоторые компоненты в приложении на Джерси в конструкторе Application (вещь, которая наследуется от ResourceConfig). Похоже, что этотДжерси и HK2 ServiceLocator

public Application(@Context ServletContext context, 
        @Context ServiceLocator locator)... 

Когда я пытаюсь использовать локатор в любой момент, я до сих пор не могу создавать экземпляры вещей, которые я зарегистрированные в AbstractBinder с использованием методы locator.create (MyThing.class).

Я уверен, что они связаны правильно, потому что они правильно введены в мои классы ресурсов через аннотацию поля @inject.

Разница в том, что структура Jersey/HK2 создает экземпляры моих классов ресурсов (как и ожидалось, поскольку они находятся в пути сканирования пакетов), но я не могу использовать ServiceLocator с помощью кода.

Моя конечная цель состоит в том, чтобы вводить другие классы не-Джерси, если они имеют атрибут @Inject, например. У меня есть рабочий класс, которому необходимо ввести настроенный уровень доступа к базе данных. Я хочу сказать

locator.Create(AWorker.class) 

и у вас есть инъекции.

Как получить реальный ServiceLocator, который будет вводить все, что я уже зарегистрировал/связал с моим Binder? (Или я должен использовать что-то другое, кроме ServiceLocator?)

+0

Я бы сказал, что вы не можете в полной мере использовать hk2 в 'приложении'. Приложение предоставляет информацию о том, как настроить Джерси. Он также должен сообщить о вашем связанном с Джерси hk2 связующем. Пока эта привязка не состоялась, она недоступна через локатор службы. –

+0

Я регистрирую свое связующее, прежде чем пытаюсь получить доступ к локатору. Все еще не уверен, что я должен делать = D – Bill

+0

Вы уверены, что связующее не только зарегистрировано, но и связывает его экземпляры? –

ответ

2

Как вы начинаете свой контейнер? Если вы используете ApplicationHandler, вы можете просто позвонить: handler.getServiceLocator(). Служба ServiceLocator - это то, что вы хотите использовать для доступа к вашим зависимостям.

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

private static final class LocatorSetFeature implements Feature { 

    private final ServiceLocator scopedLocator; 

    @Inject 
    private LocatorSetFeature(ServiceLocator scopedLocator) { 
     this.scopedLocator = scopedLocator; 
    } 

    @Override 
    public boolean configure(FeatureContext context) { 
     locator = scopedLocator; //this would set our member locator variable 
     return true; 
    } 
} 

Функция будет просто зарегистрированный в нашей конфигурации ресурсов с config.register (новый LocatorSetFeature()).

Было бы важно связать запуск других компонентов на основе жизненного цикла вашего контейнера, так что это все еще немного взломано. Возможно, вы захотите добавить эти классы в качестве зависимостей первого класса в контейнере HK2 и просто ввести соответствующие зависимости в свои сторонние классы (например, с помощью Binder).

+2

Код, который вы включили, не скомпилирован: locator = scopedLocator не компилируется, поскольку локатор не определен, где это переменная? Пожалуйста, предоставьте исправление. – PeterS