2016-04-01 3 views
0

Ich habe dieses Setup erfolgreich in früheren Methoden mit Überwachung verwendet, so dass ich jetzt wahrscheinlich etwas falsch machen. Ich benutze hauptsächlich Guice für seinen AOP-Teil.Dropwizard - Kann eine Trikot Ressource nicht registrieren mit Guice Injector.getIntance()

Relevante Abschnitte pom.xml:

<dependency> 
     <groupId>io.dropwizard</groupId> 
     <artifactId>dropwizard-core</artifactId> 
     <version>0.7.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.jboss.logging</groupId> 
       <artifactId>jboss-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>com.google.inject</groupId> 
     <artifactId>guice</artifactId> 
     <version>4.0</version> 
    </dependency> 

    <dependency> 
     <groupId>aopalliance</groupId> 
     <artifactId>aopalliance</artifactId> 
     <version>1.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>1.16.6</version> 
     <scope>provided</scope> 
    </dependency> 

BaseBindingModule:

public class BaseBindingModule extends AbstractModule{ 

    @Override 
    protected void configure() { 
     bindInterceptor(any(), annotatedWith(SendCrashReport.class), new CrashReport());  
     bind(CabManager.class).to(CabManagerImpl.class); 
    } 
} 

Die Datei, in Ressourcen registriert sind:

public class BucService extends Application<BucConfiguration> { 
    public static void main(String[] args) throws Exception { 
     new BucService().run(args); 
    } 

    @Override 
    public void initialize(Bootstrap<BucConfiguration> bootstrap) { 
     //bootstrap.setName("hello-world"); 
    } 

    @Override 
    public void run(BucConfiguration configuration, 
        Environment environment) { 
     final String template = configuration.getTemplate(); 
     final String defaultName = configuration.getDefaultName(); 
     environment.jersey().register(new HelloWorldResource(template, defaultName)); 

     Injector injector = Guice.createInjector(new BaseBindingModule()); 
     environment.jersey().register(injector.getInstance(CabResource.class)); // this does not work 
     // environment.jersey().register(new CabResource()); // this works 
    } 
} 

Die tatsächliche Ressourcendatei:

@Path("/cabs") 
@Produces(MediaType.APPLICATION_JSON) 
public class CabResource { 

    @Inject 
    CabManager manager; 


    public CabResource() { 
    } 

    @GET 
    @Path("price") 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<PriceEstimate> getCheapestCabs() { 

     return manager.callB(); 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    @SendCrashReport 
    public List<PriceEstimate> getNearestCabs(@Context UriInfo uriInfo) { 

     return manager.callA(); 
     } 

} 

Wenn ich versuche, die Ressource mit Guice Injector.getInstance() zu registrieren, wird es nicht registriert und ich kann auf keine der REST-APIs zugreifen.

Wenn ich jedoch die Ressource einfach als neue CabResource() registrieren, sind die APIs sichtbar. Aber in diesem Fall werde ich nicht in der Lage sein, GUICE AOP nach dieser Antwort arbeiten zu lassen: https://stackoverflow.com/a/8862599/1443801

Was vermisse ich?

Danke.

Edit: Dies zeigt, wenn ich die JAR-Datei ausführen. Beachten Sie, dass es keine Taxi-APIs gibt.

INFO [2016-04-01 13:26:14,785] io.dropwizard.server.ServerFactory: Starting BucService 
INFO [2016-04-01 13:26:14,876] org.eclipse.jetty.setuid.SetUIDListener: Opened [email protected]{HTTP/1.1}{0.0.0.0:9000} 
INFO [2016-04-01 13:26:14,876] org.eclipse.jetty.setuid.SetUIDListener: Opened [email protected]{HTTP/1.1}{0.0.0.0:9001} 
INFO [2016-04-01 13:26:14,877] org.eclipse.jetty.server.Server: jetty-9.0.z-SNAPSHOT 
INFO [2016-04-01 13:26:14,965] com.sun.jersey.server.impl.application.WebApplicationImpl: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM' 
INFO [2016-04-01 13:26:15,060] io.dropwizard.jersey.DropwizardResourceConfig: The following paths were found for the configured resources: 

    GET  /hello-world (com.buc.resources.HelloWorldResource) 

INFO [2016-04-01 13:26:15,262] org.eclipse.jetty.server.handler.ContextHandler: Started [email protected]{/,null,AVAILABLE} 
INFO [2016-04-01 13:26:15,263] io.dropwizard.setup.AdminEnvironment: tasks = 

    POST /tasks/gc (io.dropwizard.servlets.tasks.GarbageCollectionTask) 

WARN [2016-04-01 13:26:15,264] io.dropwizard.setup.AdminEnvironment: 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
! THIS APPLICATION HAS NO HEALTHCHECKS. THIS MEANS YOU WILL NEVER KNOW  ! 
!  IF IT DIES IN PRODUCTION, WHICH MEANS YOU WILL NEVER KNOW IF YOU'RE  ! 
! LETTING YOUR USERS DOWN. YOU SHOULD ADD A HEALTHCHECK FOR EACH OF YOUR ! 
!   APPLICATION'S DEPENDENCIES WHICH FULLY (BUT LIGHTLY) TESTS IT.  ! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
INFO [2016-04-01 13:26:15,269] org.eclipse.jetty.server.handler.ContextHandler: Started [email protected]{/,null,AVAILABLE} 
INFO [2016-04-01 13:26:15,279] org.eclipse.jetty.server.ServerConnector: Started [email protected]{HTTP/1.1}{0.0.0.0:9000} 
INFO [2016-04-01 13:26:15,280] org.eclipse.jetty.server.ServerConnector: Started [email protected]{HTTP/1.1}{0.0.0.0:9001} 

Eine weitere Klärung auf der Grundlage der Kommentare:

ich eine Instanz erhalten mit injector.getInstance (CabResource.class).

Zum Beispiel:

CabResource a = new CabResource(); 
CabResource b = injector.getInstance(CabResource.class); 

a.getCheapestCabs(); 
b.getCheapestCabs(); 

beide der Anrufe arbeiten.

+0

Ihr Fehlerprotokoll würde Hinzufügen wahrscheinlich dazu beitragen, einige – J2B

+0

kein Fehler ist. Es registriert sich einfach nicht. Ich kann das Glas schön laufen lassen. Ich kann einfach nicht auf die APIs zugreifen. Es heißt 404 nicht gefunden. – Paagalpan

+0

Ich fügte noch die Ausgabe hinzu, die ich erhalte, wenn ich den Behälter laufe. – Paagalpan

Antwort

0

Haben Sie in Betracht gezogen, https://github.com/HubSpot/dropwizard-guice zu verwenden?

<dependency> 
    <groupId>com.hubspot.dropwizard</groupId> 
    <artifactId>dropwizard-guice</artifactId> 
    <version>${dropwizard.guice.version}</version> 
</dependency> 

Wie dieser Kerl tat https://gitlab.com/michael-lloyd-lee/dropwizard-guice-example/tree/master

+0

Wir werden uns darum kümmern. Vielen Dank. Obwohl unter Aufsicht bei einer anderen Arbeit, hatte ich das gleiche Setup erfolgreich ohne die Notwendigkeit dieser Bibliotheken ausgeführt. Daher möchte ich das Problem wirklich lösen, ohne eine andere externe Bibliothek zu verwenden und das Problem mit dem aktuellen Code herauszufinden. – Paagalpan

Verwandte Themen