2014-11-04 16 views
6

Bir dropwizard uygulamasında Weld-SE bağımlılık enjeksiyonu için kullanıyorum. I Weld bootstrap ve bu gibi uygulama sınıfında enjekte edebilirWeld with Dropwizard

public class App extends Application<AppConfig> { 

    @Inject NameService service; 
    @Inject RestResource resource; 

    public static void main(String[] args) throws Exception { 
    Weld weld = new Weld(); 
    WeldContainer container = weld.initialize(); 
    App app = container.instance().select(App.class).get();  
    app.run(args); 
    weld.shutdown(); 
    } 
} 

I RestResource için ayrı bir sınıftaki bir üretici yöntemi yazdım ve bu da iyi enjekte edilir. Ancak, kaynak sınıfında hizmet enjekte edilmemiştir: hizmet her zaman boştur. Bu işi nasıl yapacağını bilen var mı?

+0

Başvurunuz sınıfında Kayıt kaynak kullanıcısının dinleyici? – siva636

+0

Kap yok. Dropwizard java se, tüm hizmetlerle (jetty, jersey vb. Varsayılan olarak orada) gömülü bir şişman kavanoz oluşturur. Yapmaya çalıştığım şey, bunlardan biri olan kaynak-se. –

cevap

7

Dropwizard bağımlılık enjeksiyonu, CDI değil HK2 tabanlı olan Jersey kullanıyor. Sonuç olarak, ikisi arasında bir köprü olması gerekir. Yalnızca sınıf yolunda olduğunu JAR olması gerekir

<dependency> 
    <groupId>org.glassfish.jersey.containers.glassfish</groupId> 
    <artifactId>jersey-gf-cdi</artifactId> 
</dependency> 

: Bu için jersey-gf-cdi budur. Burada burada İskelesi'ne için bir yapılandırma görebilirsiniz: https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/pom.xml

Ve JAX-RS kaynak haline CDI fasulye enjeksiyon örneği bundan sonra: DropWizard 0.8.1 ve Weld 2.2 için https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/src/main/java/io/astefanutti/cdeye/web/BeansResource.java

+0

Teşekkürler ama bu işe yaramaz sanmıyorum - bu modül sadece 2 forması için var gibi görünüyor ama geçerli dropwizard (0.7.0) forması 1.18 kullanıyor. –

+3

@martincharlesworth İsterseniz Dropwizard 0.8.0 RC'yi deneyebilirsiniz, Jersey 2.13 –

+0

desteği sayesinde antonin & abdullah - bu jar artı dropwizard 0.8.0-snapshot kullanarak çalışır –

2

Prosedür aşağıdaki gibidir:

<dependency> 
    <groupId>org.jboss.weld.servlet</groupId> 
    <artifactId>weld-servlet-core</artifactId> 
    <version>2.2.11.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.ext.cdi</groupId> 
    <artifactId>jersey-cdi1x</artifactId> 
    <version>2.17</version> 
</dependency> 
<!-- the following additional dependencies are needed by weld --> 
<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jsp-api</artifactId> 
    <version>2.0</version> 
</dependency> 
<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
</dependency> 

2) src/main/resources/META-INF beans.xml dosyası ekleyin ve üzerine uygulanabilme bir içerme filtresi eklemek:

1) pom.xml için bağımlılıkları ekleyin ation paketleri. Bu özellikle gölgeli kavanozu kullanırken gereklidir - filtre olmadan Weld gölgeli kavanoza her sınıfı tarar.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:weld="http://jboss.org/schema/weld/beans"> 

    <weld:scan> 
     <weld:include name="com.example.**" /> 
    </weld:scan> 
</beans> 

3) Kullandığınız hangi konteyner

@Override 
public void run(Configuration conf, Environment env) throws Exception { 
    env.servlets().addServletListeners(new org.jboss.weld.environment.servlet.Listener()); 
} 
+0

Bu sonuç java.lang.NoClassDefFoundError: javax/servlet/jsp/JspFactory \t org.jboss.weld.environment.servlet.WeldServletLifecycle.initialize (WeldServletLifecycle.java:174) ~ [kaynak-sunucu-çekirdek-2.2.11.Final.jar: 2015-04-15 09 : 30] ' – KIC