2014-11-04 3 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(); 
    } 
} 

여기서 서비스는 항상 null입니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까?

+0

응용 프로그램 클래스에 등록 용접의 청취자? – siva636

+0

컨테이너가 없습니다. Dropwizard는 Java SE이며 모든 서비스 (부두, 저지 등 기본적으로 거기에 있음)가있는 팻 항아리를 내장합니다. 내가하려고하는 것은 weld-se를 그 중 하나로 포함시키는 것입니다. –

답변

7

Dropwizard는 종속성 주입이 CDI가 아닌 HK2를 기반으로하는 저지를 사용합니다. 결과적으로 둘 사이에 다리가 있어야합니다. 당신은 클래스 패스에 그 JAR이 필요

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

:이의 jersey-gf-cdi는 것입니다. 여기서 여기서 부두의 구성 볼 수 https://github.com/astefanutti/cdeye/blob/cd6d31203bdd17262aab12d992e2a730c4f8fdbd/webapp/pom.xml

및 JAX-RS 리소스에 CDI 콩 주입의 일례를 이하 : DropWizard 0.8.1 용접 2.2 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을 사용하고 있습니다. –

+3

@martincharlesworth 만약 당신이 Dropwizard 0.8.0 RC를 시도해보고 싶다면 Jersey 2.13을 지원합니다. –

+0

감사합니다 antonin & abdullah - jar plus dropwizard를 사용합니다. 0.8.0-snapshot 작동합니다. –

2

절차는 다음 :

<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/메인/자원/META-INF에 beans.xml 환경 파일을 추가하고 APPLIC에 대한 포함 필터를 추가 :

1)의 pom.xml에 종속성을 추가 ation 패키지. 음영 처리 된 jar를 사용할 때 특히 필요합니다. Weld 필터를 사용하지 않으면 음영 처리 된 jar의 모든 클래스를 검사합니다.

<?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/서블릿/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