2014-11-04 56 views
6

我想在dropwizard應用程序中使用Weld-SE進行依賴注入。我可以引導焊縫和應用程序級的注入,像這樣:使用焊接與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(); 
    } 
} 

我已經寫在了RestResource一個單獨的類生產者方法,這也被注入罰款。但是在資源類別中服務不被注入:

@Path("/test") 
@Produces(MediaType.APPLICATION_JSON) 
public class RestResource { 
    @Inject NameService service; 

    @GET 
    public String test() { 
     return service.getName(); 
    } 
} 

此處的服務始終爲空。有誰知道如何使這項工作?

+0

什麼容器您使用在您的應用程序類註冊焊縫的聽衆? – siva636 2014-11-05 02:48:49

+0

沒有容器。 Dropwizard是java se,它構建了一個包含所有服務(jetty,jersey等默認存在)的胖罐子。我想要做的是將weld-se作爲其中之一。 – 2014-11-06 09:57:05

回答

7

Dropwizard使用澤西島的依賴注入是基於HK2而不是CDI。因此,你需要在兩者之間架起一座橋樑。這是jersey-gf-cdi是什麼:

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

你只需要在類路徑是JAR。你可以看到這裏爲碼頭這裏的結構: https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/pom.xml

和將來CDI豆噴射的一個例子爲JAX-RS資源: https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/src/main/java/io/astefanutti/cdeye/web/BeansResource.java

+0

謝謝,但我不認爲這可以工作 - 該模塊似乎只適用於球衣2+,但目前的dropwizard(0.7.0)使用球衣1.18。 – 2014-11-06 09:58:25

+3

@martincharlesworth如果你想要你可以試試Dropwizard 0.8.0 RC,它支持Jersey 2.13 – 2014-11-11 12:03:57

+0

謝謝antonin&abdullah - 使用jar加dropwizard 0.8.0 - 快照有效 – 2014-11-14 23:42:24

2

對於DropWizard 0.8.1和2.2焊接的程序如下:

1)添加的依賴性來的pom.xml:

<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)添加的beans.xml文件爲src /主/資源/ META-INF和添加夾雜物過濾器應用程一攬子計劃。當使用陰影罐時,這是特別需要的 - 沒有過濾器,Weld會掃描陰影罐中的每個類。

<?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)

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

這會導致'java.lang.NoClassDefFoundError:javax/servlet/jsp/JspFactory \t at org.jboss.weld.environment.servlet.WeldServletLifecycle.initialize(WeldServletLifecycle.java:174)〜[weld-servlet-core-2.2.11.Final.jar:2015-04-15 09 :30]' – KIC 2015-10-26 12:13:10