2014-11-04 12 views
6

Próbuję użyć Weld-SE do wstrzyknięcia zależności w aplikacji Dropwizard. Mogę bootstrap spawać i wstrzyknąć w klasie Application tak:Używanie 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(); 
    } 
} 

Pisałem metodę producentów w osobnej klasy dla RestResource i to jest również wstrzykiwany w porządku. Jednak w klasie zasobów usługa nie jest wstrzykiwana:

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

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

Tutaj usługa jest zawsze pusta. Czy ktoś wie jak to zrobić?

+0

Co pojemnik używasz? – siva636

+0

Brak pojemnika. Dropwizard to java se, buduje słoik ze wszystkimi usługami (pomost, koszulka itp. Są tam domyślnie) osadzone. Co próbuję zrobić, to spoina-se jako jedna z tych. –

Odpowiedz

7

Dropwizard używa Jersey, którego wtrysk zależności jest oparty na HK2, a nie na CDI. W konsekwencji musisz mieć most między tymi dwoma. To jest to, co jest dla jersey-gf-cdi:

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

Wystarczy tylko mieć tego JAR w ścieżce klasy. Można zobaczyć tutaj konfigurację dla Jetty tutaj: https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/pom.xml

A poniżej przykład CDI zastrzyku fasoli w JAX-RS zasobu: https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/src/main/java/io/astefanutti/cdeye/web/BeansResource.java

+0

Dzięki, ale nie sądzę, żeby to działało - ten moduł wydaje się istnieć tylko dla koszulki 2+, ale obecny dropwizard (0.7.0) używa koszulki 1.18. –

+3

@martincharlesworth Jeśli chcesz, możesz wypróbować Dropwizard 0.8.0 RC, obsługuje on Jersey 2.13 –

+0

dzięki antonin & abdullah - używając tego słoika plus zrzut ekranu 0.8.0 0.01.0 działa –

2

Dla DropWizard 0.8.1 i Weld 2.2 procedura jest następująca:

1) Dodaj zależności do 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) Dodaj plik beans.xml do src/main/resources/META-INF i dodać filtr integracji dla applic Pakiety ation. Jest to szczególnie potrzebne w przypadku używania zacienionego słoika - bez filtra Weld skanowałby każdą klasę w zacienionym słoiku.

<?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) słuchacz Rejestracja | spoina w swojej klasie aplikacji

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

Powoduje to, że 'java.lang.NoClassDefFoundError: javax/servlet/jsp/JspFactory \t at org.jboss.weld.environment.servlet.WeldServletLifecycle.initialize (WeldServletLifecycle.java:174) ~ [spaw-servlet-core-2.2.11.Final.jar: 2015-04-15 09 : 30] " – KIC

Powiązane problemy