2014-01-08 2 views
6

Я использую Jetty 9.1 и Jersey 2.5.1. Джерси имеет встроенную поддержку для Jetty, так что я начинаю мой сервер так:Jetty Embedded, Jersey 2, Weld

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(...) для поиска моей REST классы API.

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

(У меня есть org.glassfish.hk2.api.UnsatisfiedDependencyException при ударе по конечной точке REST).

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

+0

Убедитесь, что вы используете Weld 2.2+, поскольку он исправил несколько ошибок интеграции CDI с Jetty 9.1+. –

ответ

3

Я использовал 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, так что я должен был написать связующее, чтобы сделать инъекции работу в этих классах. This question helped me a lot.

Смежные вопросы