2016-04-27 11 views
0

Ich arbeite an einem Projekt, das Guice Integration mit Dropwizard erfordert. Folgendes ist die Art, wie ich es entworfen habe.Dropwizard Guice Fehler: Fehlende Abhängigkeit für Konstruktor

ApplicationClass

public class MyService extends Application<MyServiceConfig> { 

    public static void main(String[] args) throws Exception { 
     new MyService().run(args); 
    } 

    @Override 
    public void initialize(Bootstrap<MyServiceConfig> bootstrap) { 
     GuiceBundle<MyServiceConfig> guiceBundle = GuiceBundle.<MyServiceConfig>newBuilder() 
       .addModule(new MyServiceModule()) 
       .setConfigClass(MyServiceConfig.class) 
       .enableAutoConfig(this.getClass().getPackage().getName()) 
       .build(); 

     bootstrap.addBundle(guiceBundle); 
    } 

    @Override 
    public void run(MyServiceConfig config, Environment environment) throws Exception{ 

    } 

Dies ist MyServiceModule die ich

public class MyServiceModule extends AbstractModule{ 
    @Provides 
    public MyDataStoreInterface getDataStore(MyServiceConfig myServiceConfig){ 
     return new MyDataStore(myServiceConfig.getConfig1(), myServiceConfig.getConfig2()); 
    } 

    @Override 
    protected void configure() { 

    } 
} 

geschrieben sind meine Datenspeicher-Dateien sind

public interface MyDataStoreInterface { 
    public void method1(); 
} 

public class MyDataStore implements MyDataStoreInterface { 
    public MyDataStore(Config1 config1, Config2 config2){ 
    /*implementation*/ 
    } 
    public void method1(){ 
    /*implementation*/ 
    } 
} 

Und schließlich finden Sie meine Ressource-Datei

@Path("/documents") 
@Produces(MediaType.APPLICATION_JSON) 
public class MyResource { 
    private MyDataStoreInterface myDataStore; 

    @Inject 
    public MyResource(MyDataStoreInterface myDataStore) { 
    this.myDataStore = myDataStore; 
    } 
} 

Wenn ich die obige Anwendung ausführen ich die folgende Fehlermeldung erhalten:

ERROR [2016-04-27 20:34:29,669] com.sun.jersey.spi.inject.Errors: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Missing dependency for constructor public com.mobile.myservice.resources.MyResource(com.mobile.myservice.datastore.MyDataStoreInterface) at parameter index 0

Kann mir jemand helfen, wo ich falsch mache?

+0

Haben Sie jemals MyServiceConfig überall binden? Welche Art von Guice-Integration verwenden Sie? – pandaadb

Antwort

0

Ich vermute, Ihr Problem ist, dass Dropwizard Jersey unter der Haube verwendet. Beachten Sie, dass es sich bei der Ausnahme nicht um Guice, sondern um Jersey handelt. Jersey und Guice brauchen einige Verbesserungen, die zusammenarbeiten. Jersey hat sein eigenes DI-Framework (HK2). Sie müssen sie überbrücken.

Bearbeiten: Werfen Sie einen Blick auf dropwizard-guicey, ein Projekt für Ihr Problem. Danke an @pandaadb für den Kommentar unten.

Sehr schnelles Codebeispiel:

@ApplicationPath("api") 
public class ApiRest extends ResourceConfig { 
    private static final Logger log = LoggerFactory.getLogger(ApiRest.class); 

    @Inject 
    public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) { 
     log.debug("Inicialitzant Jersey."); 
     packages("net.sargue.app.api"); 

     GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); 
     GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); 
     Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName()); 
     if (injector == null) 
      throw new RuntimeException("Guice Injector not found"); 
     guiceBridge.bridgeGuiceInjector(injector); 
    } 
} 

, die für einen Standard-Jersey/JAX-RS-API arbeiten. Sie müssten wahrscheinlich Dropwizard anpassen.

Sehen Sie diese Frage und meine Antwort:

+0

In diesem Fall gibt es Integrations-Frameworks, die das für Sie erledigen. Ich benutze https://github.com/xvik/dropwizard-guicey und bin sehr glücklich damit. Dadurch werden alle Jersey-Komponenten (Anbieter, Filter, Ressourcen etc.) automatisch für mich entdeckt und injiziert. – pandaadb

Verwandte Themen