2014-11-04 10 views
6

Sto cercando di utilizzare Weld-SE per l'integrazione delle dipendenze in un'applicazione dropwizard. Posso bootstrap Weld e iniettare nella classe Application in questo modo:Utilizzo di Weld 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(); 
    } 
} 

Ho scritto un metodo produttore in una classe separata per la RestResource e questo è anche iniettato bene. Tuttavia nella classe di risorse il servizio non viene iniettato:

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

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

Qui il servizio è sempre nullo. Qualcuno sa come farlo funzionare?

+0

Cosa contenitore stai usando? – siva636

+0

Nessun contenitore. Dropwizard è java se, costruisce un barattolo di grasso con tutti i servizi (jetty, jersey ecc sono in là di default) incorporato. Quello che sto cercando di fare è includere weld-se come uno di quelli. –

risposta

7

Il dropwizard utilizza Jersey la cui iniezione di dipendenza è basata su HK2 e non su CDI. Di conseguenza è necessario avere un ponte tra i due. Questo è ciò che il jersey-gf-cdi è per:

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

Hai solo bisogno di avere quel vaso nel classpath. Potete vedere qui una configurazione per Jetty qui: https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/pom.xml

E di seguito un esempio di iniezione di fagioli CDI in risorse JAX-RS: https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/src/main/java/io/astefanutti/cdeye/web/BeansResource.java

+0

Grazie, ma non penso che questo possa funzionare - quel modulo sembra esistere solo per la maglia 2+ ma l'attuale dropwizard (0.7.0) usa la maglia 1.18. –

+3

@martincharlesworth Se vuoi provare Dropwizard 0.8.0 RC, supporta Jersey 2.13 –

+0

grazie antonin & abdullah - usando quel jar plus dropwizard 0.8.0-snapshot funziona –

2

Per DropWizard 0.8.1 e 2.2 Saldare la procedura è la seguente:

1) Aggiungere le dipendenze a 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) Aggiungi file beans.xml a src/main/resources/META-INF e aggiungere un filtro di inclusione per applic pacchetti di azioni. Questo è particolarmente necessario quando si usa il barattolo ombreggiato: senza il filtro Weld esegue la scansione di ogni classe nel barattolo ombreggiato.

<?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) ascoltatore del Registro Weld nella classe di applicazione

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

Questo risultato in 'java.lang.NoClassDefFoundError: javax/servlet/jsp/JspFactory \t in org.jboss.weld.environment.servlet.WeldServletLifecycle.initialize (WeldServletLifecycle.java:174) ~ [weld-servlet-core-2.2.11.Final.jar: 2015-04-15 09 : 30] ' – KIC

Problemi correlati