Врезанный причал, Джерси 2, Сварка

Я использую Jetty 9.1 и Jersey 2.5.1. В Джерси есть встроенная поддержка Jetty, поэтому я запускаю свой сервер следующим образом:

public static void main(String[] args) {

    URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build();
    ResourceConfig config = ResourceConfig.forApplicationClass(MyApplication.class);

    Server server = JettyHttpContainerFactory.createServer(baseUri, config);
}

MyApplication просто вызывает this.packages(...) для поиска моих классов API REST.

Однако класс API REST содержит @Inject аннотированное поле, которое должно быть введено WELD. Очевидно, WELD не запущен (поддержка CDI не включена), и, что еще более странно, похоже, что HK2 (используемый Джерси 2) пытается выполнить инъекцию.

(У меня org.glassfish.hk2.api.UnsatisfiedDependencyException при нажатии на конечную точку REST).

Как правильно настроить WELD (желательно программно)?


person coffee_machine    schedule 08.01.2014    source источник
comment
Убедитесь, что вы используете Weld 2.2+, поскольку он только что исправил несколько ошибок интеграции CDI с Jetty 9.1+.   -  person Joakim Erdfelt    schedule 08.01.2014


Ответы (1)


Я использовал Weld SE:

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

А потом просто

Weld weld = new Weld();
try {
    WeldContainer container = weld.initialize();

    URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build();
    ResourceConfig config = ResourceConfig.forApplicationClass(MyApplication.class);

    Server server = JettyHttpContainerFactory.createServer(baseUri, config);

    server.join();

} catch (Exception e) {
    e.printStackTrace();
} finally {
    weld.shutdown();
}

Обратите внимание, что HK2 будет обрабатывать классы REST, поэтому мне пришлось написать связыватель, чтобы инъекция работала в этих классах. Этот вопрос мне очень помогли.

person coffee_machine    schedule 09.01.2014