2017-02-19 2 views
0

J'ai du mal à convaincre Guice de travailler avec mes cours de Jersey/Grizzly. J'ai commencé avec l'application console Java, j'ai ajouté Guice et j'ai fait fonctionner mon injection ainsi que les objets de mon domaine. Ensuite, j'ai ajouté des services Web via Jersey/Grizzly. Comme vous pouvez le dire à partir de mon style de codage, je viens d'un arrière-plan C#. Donc, je suis sûr que mon combat apprend la façon de faire de Javas. Ce que je veux, c'est que mes classes non webservices puissent être injectées dans les gestionnaires de services web pour qu'ils puissent utiliser la fonctionnalité que j'ai créée.Jersey Guice Exception d'intégration

Dans ma classe ci-dessous, j'ai un gestionnaire d'instance de base de données que je veux injecter dans les classes de webservices:

@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 
    } 
} 

J'ai essayé d'ajouter à GuiceBridge et obligatoire dans mon extension de la classe ResourceConfig. Mais peu importe la version que j'ai utilisée, j'ai des exceptions vraiment folles concernant les propriétés manquantes lorsque j'ai essayé d'initialiser les services Web. Le simple fait de supprimer GuiceBridge de mon fichier pom.xml supprime l'exception. Il semble que son problème de compatibilité de version mais je ne comprends pas quelle version de quelle bibliothèque.

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) 

Et mon 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> 

excusez-moi, je ne peux pas expliquer ce problème avec plus définitif est ici ce qui est faux. J'ai peut-être architecturé mon application complètement faux et étant donné que c'est juste moi apprendre, je suis d'accord avec ça. Je voudrais éviter de réécrire la construction de ma logique de domaine et les tests unitaires.

Merci pour votre aide Matt

Répondre

0

explication d'erreur

A java.lang.NoSuchMethodError est certainement une erreur avec des packages et des versions de la bibliothèque. Cela signifie que vous avez compilé du code référençant une méthode qui n'existe pas dans votre code d'exécution.

Ce n'est pas une erreur courante dans votre code car le compilateur ne vous laissera pas passer le code référençant une méthode inexistante. Mais dans ce cas, le code référençant la méthode et le code référencé sont les deux bibliothèques, ce qui signifie que le code avec la référence de la méthode a été compilé avec une version différente de la classe cible.

D'une certaine manière, cette erreur est analogue à la plus courante ClassNotFoundException. Mais au lieu de ne pas trouver de classe, vous ne trouvez pas de méthode dans une classe.

Trouver la source de votre problème

Maintenant, vous savez quel est le problème. Je le crains, la résolution n'est pas si facile. La gestion des paquets et la résolution des bibliothèques avec Java deviennent de plus en plus difficiles chaque année. Je vois que vous utilisez le bom (nomenclature) pour la bibliothèque Jersey. En outre, votre fichier pom n'est pas facile. Je vous suggère de construire un projet de test uniquement avec la structure de votre code API (jax-rs) avec Guice et le pont HK2-Guice. Peut-être au lieu d'utiliser la nomenclature essayer ces versions récentes, ils travaillent pour moi:

  • com.google.inject: Guice: 4.1.0
  • org.glassfish.jersey.containers: jersey-conteneur servlet: 2.25
  • org.glassfish.hk2: Guice-pont:. 2,5 +

J'utilise le conteneur de servlet mais vous utilisez un modèle autonome. Cela n'a pas d'importance, utilisez le vôtre mais gardez le numéro de version.

Maven résolution

Essayez également de vérifier la version de chaque paquet que vous notamment à l'occasion finale. Vous pouvez trouver cette commande Maven utile pour afficher l'arborescence de dépendances:

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

+0

Ceci est une excellente explication. Je suis désolé, c'est une question de débutant. Comment ne pas utiliser la nomenclature? – tatmanblue

+0

@tatmanblue Facile. Vous supprimez la déclaration bom et ajoutez une version à chaque dépendance. La nomenclature est juste une _meta-dependency_ qui vous donne des versions exactes. Regardez les déclarations '' sans ''. Pour plus d'informations, voir [http://stackoverflow.com/questions/14874966/how-to-use-bom-file-with-maven](this question). – sargue

+0

Merci. Supprimer la nomenclature, définir des numéros de version spécifiques pour les dépendances, comme vous l'avez appelé, a résolu mon problème. Je suis maintenant capable d'accéder à mes webservices à partir d'un navigateur sans erreurs (j'ai dû ajouter une dépendance pour la sérialisation json) – tatmanblue