2017-02-19 3 views
0

Ich habe Schwierigkeiten, Guice mit meinen Jersey/Grizzly-Klassen zu arbeiten. Ich begann mit der Konsolen-Java-App, fügte Guice hinzu und ließ meine Injektion sowie meine Domain-Objekte arbeiten. Dann habe ich Webservices über Jersey/Grizzly hinzugefügt. Wie Sie vielleicht anhand meines Codierungsstils sehen können, komme ich von einem C# -Hintergrund. Ich bin mir sicher, dass mein Kampf darin besteht, Javas Art zu lernen, Dinge zu tun.Jersey Guice Integration Ausnahme

Was ich möchte ist, dass meine nicht Webservices-Klassen in die Webservices-Handler injiziert werden können, damit sie die Funktionalität, die ich gebaut habe, verwenden können.

In meiner Klasse unten, ich habe eine Datenbankinstanz Handler ich in die Web Service-Klassen injizieren will:

@Path("/options") 
public class OptionsServices { 

    private IDatabaseService dbService; 

    @Inject 
    public void setService(IDatabaseService svc){ 
     this.dbService = svc; 
    } 


    @GET 
    @Path("{symbol}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Quote getOptionQuote(@PathParam("symbol") String symbol) { 
     // do stuff 
    } 
} 

ich in GuiceBridge versucht, das Hinzufügen und Bindung, die in meiner Erweiterung der ResourceConfig Klasse. Aber egal, welche Version ich verwendet habe, ich bekomme einige wirklich verrückte Ausnahmen über fehlende Eigenschaften, als ich versuchte, die Webdienste zu initialisieren. Durch einfaches Entfernen von GuiceBridge aus meiner pom.xml wird die Ausnahme entfernt. Es scheint, als wäre das Problem mit der Versionskompatibilität, aber ich weiß nicht, welche Version welcher Bibliothek.

Exception in thread "main" java.lang.NoSuchMethodError: org.glassfish.hk2.utilities.general.GeneralUtilities.getSystemProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.<clinit>(ServiceLocatorImpl.java:122) 
     at org.jvnet.hk2.external.generator.ServiceLocatorGeneratorImpl.initialize(ServiceLocatorGeneratorImpl.java:66) 
     at org.jvnet.hk2.external.generator.ServiceLocatorGeneratorImpl.create(ServiceLocatorGeneratorImpl.java:98) 
     at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.internalCreate(ServiceLocatorFactoryImpl.java:312) 
     at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.create(ServiceLocatorFactoryImpl.java:268) 
     at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:138) 
     at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:123) 
     at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:308) 
     at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:289) 
     at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.<init>(GrizzlyHttpContainer.java:334) 
     at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:122) 
     at Application.Server.WebServer.startServer(WebServer.java:40) 
     at Application.Server.WebServer.Start(WebServer.java:45) 
     at Application.Startup.run(Startup.java:68) 
     at Application.Startup.main(Startup.java:87) 

Und mein pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>tatmancapital</groupId> 
    <artifactId>ServerConsole</artifactId> 
    <version>R1</version> 

    <properties> 
     <jersey.version>2.17</jersey.version> 
    </properties> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.glassfish.jersey</groupId> 
       <artifactId>jersey-bom</artifactId> 
       <version>${jersey.version}</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <!-- https://mvnrepository.com/artifact/com.google.inject/guice --> 
     <dependency> 
      <groupId>com.google.inject</groupId> 
      <artifactId>guice</artifactId> 
      <version>4.1.0</version> 
     </dependency> 

     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.6</version> 
     </dependency> 

     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.15</version> 
      <exclusions> 
       <exclusion> 
        <groupId>com.sun.jmx</groupId> 
        <artifactId>jmxri</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>com.sun.jdmk</groupId> 
        <artifactId>jmxtools</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>javax.jms</groupId> 
        <artifactId>jms</artifactId> 
       </exclusion> 
      </exclusions>   
     </dependency>  

     <dependency> 
      <groupId>commons-codec</groupId> 
      <artifactId>commons-codec</artifactId> 
      <version>1.3</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-httpclient</groupId> 
      <artifactId>commons-httpclient</artifactId> 
      <version>3.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.thoughtworks.xstream</groupId> 
      <artifactId>xstream</artifactId> 
      <version>1.4.9</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-lang</groupId> 
      <artifactId>commons-lang</artifactId> 
      <version>2.4</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.0.4</version> 
     </dependency> 

     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-grizzly2-http</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-moxy</artifactId> 
     </dependency> 


     <dependency> 
      <groupId>org.glassfish.hk2</groupId> 
      <artifactId>guice-bridge</artifactId> 
      <version>2.5.0-b32</version> 
     </dependency>  

     <dependency> 
      <groupId>commons-httpclient-ssl-contrib</groupId> 
      <artifactId>commons-httpclient-ssl-contrib</artifactId> 
      <version>3.1</version> 
      <scope>system</scope> 
      <systemPath>${project.basedir}/libs/commons-httpclient-contrib-ssl-3.1.jar</systemPath> 
     </dependency> 

     <dependency> 
      <groupId>etrade</groupId> 
      <artifactId>com.etrade.accounts</artifactId> 
      <version>1.0</version> 
      <scope>system</scope> 
      <systemPath>${project.basedir}/libs/etws-accounts-sdk-1.0.jar</systemPath> 
     </dependency> 

     <dependency> 
      <groupId>etrade</groupId> 
      <artifactId>com.etrade.order</artifactId> 
      <version>1.0</version> 
      <scope>system</scope> 
      <systemPath>${project.basedir}/libs/etws-order-sdk-1.0.jar</systemPath> 
     </dependency> 

     <dependency> 
      <groupId>etrade</groupId> 
      <artifactId>com.etrade.oauth</artifactId> 
      <version>1.0</version> 
      <scope>system</scope> 
      <systemPath>${project.basedir}/libs/etws-oauth-sdk-1.0.jar</systemPath> 
     </dependency> 

     <dependency> 
      <groupId>etrade</groupId> 
      <artifactId>com.etrade.markets</artifactId> 
      <version>1.0</version> 
      <scope>system</scope> 
      <systemPath>${project.basedir}/libs/etws-market-sdk-1.0.jar</systemPath> 
     </dependency> 

     <dependency> 
      <groupId>etrade</groupId> 
      <artifactId>com.etrade.common</artifactId> 
      <version>1.0</version> 
      <scope>system</scope> 
      <systemPath>${project.basedir}/libs/etws-common-connections-1.0.jar</systemPath> 
     </dependency>    

    </dependencies> 

    <build> 
     <plugins>  
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>3.0.0</version> 
      <configuration> 
       <archive> 
        <manifest>    
        <mainClass>Application.Startup</mainClass>     
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <appendAssemblyId>false</appendAssemblyId> 
       <finalName>ServerConsole-V1</finalName> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> <!-- this is used for inheritance merges --> 
        <phase>package</phase> <!-- bind to the packaging phase --> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin>  
     </plugins> 
    </build> 
</project> 

Ich entschuldige ich mich nicht, dieses Problem mit endgültigere erklären hier, was falsch ist. Ich habe vielleicht meine App völlig falsch aufgebaut, und da ich nur lerne, bin ich damit einverstanden. Ich möchte vermeiden, meine Domänenlogik-Konstruktion und Unit-Tests neu zu schreiben.

Vielen Dank für Ihre Hilfe Matt

Antwort

0

Fehlererklärung

A java.lang.NoSuchMethodError mit Paketen und Bibliotheksversionen auf jeden Fall ein Fehler ist. Es bedeutet, dass Sie Code kompiliert haben, der auf eine Methode verweist, die in Ihrem Laufzeitcode nicht vorhanden ist.

Es handelt sich nicht um einen Fehler, der normalerweise in Ihrem Code auftritt, da der Compiler Sie nicht den Code übergeben lässt, der auf eine nicht vorhandene Methode verweist. Aber in diesem Fall sind der Code, der auf die Methode verweist, und der referenzierte Code beide Bibliotheken, was bedeutet, dass der Code mit der Methodenreferenz gegen eine andere Version der Zielklasse kompiliert wurde.

Irgendwie ist dieser Fehler analog zu den häufiger ClassNotFoundException. Aber anstatt eine Klasse zu finden, findet man keine Methode innerhalb einer Klasse.

die Ursache des Problems zu finden

Jetzt wissen Sie, was das Problem ist. Es zu lösen, fürchte ich, ist nicht so einfach. Die Paketverwaltung und Bibliotheksauflösung mit Java wird jedes Jahr schwieriger. Ich sehe, Sie verwenden die bom (Bill of Materials) für die Jersey-Bibliothek. Auch Ihre pom Datei ist nicht einfach. Ich empfehle Ihnen, ein Testprojekt nur mit der Struktur Ihres API (jax-rs) -Codes mit Guice und der HK2-Guice-Bridge zu erstellen. Vielleicht stattdessen die BOM versuchen, diese neueren Versionen zu verwenden, sie arbeiten für mich:

  • com.google.inject: guice: 4.1.0
  • org.glassfish.jersey.containers: Jersey-Behälter-Servlet: 2.25
  • org.glassfish.hk2: guice-Brücke. 2,5 +

Ich bin mit den Servlet Containern aber ein eigenständiges eines verwenden. Es spielt keine Rolle, benutze deine, aber behalte die Versionsnummer.

Maven Auflösung

versuchen auch zu prüfen, welche Version von jedem Paket, das Sie in der letzten Build inklusive sind. Sie können nützlich diese Maven Befehl finden die Abhängigkeitsstruktur anzuzeigen:

https://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html

+0

Dies ist eine große Erklärung. Ich entschuldige mich das ist eine neue Frage. Wie verwende ich die Stückliste nicht? – tatmanblue

+0

@tatmanblue Einfach. Sie entfernen die bom-Deklaration und fügen jeder Abhängigkeit eine Version hinzu. Die BOM ist nur eine _Meta-Abhängigkeit_, die Ihnen exakte Versionen liefert. Sehen Sie sich '' Deklarationen ohne '' an. Für weitere Informationen siehe [http://stackoverflow.com/questions/14874966/how-to-use-bom-file-with-maven](this question). – sargue

+0

Vielen Dank. Das Entfernen der Stückliste, das Festlegen bestimmter Versionsnummern für die Abhängigkeiten, wie Sie aufgerufen haben, behebt mein Problem. Ich bin nun in der Lage, von einem Browser aus fehlerfrei auf meine Webdienste zuzugreifen (ich musste eine Abhängigkeit für die json-Serialisierung hinzufügen) – tatmanblue

Verwandte Themen