2017-02-19 3 views
0

Я изо всех сил пытаюсь заставить Guice работать со своими классами в Джерси/Гризли. Я начал с консольного Java-приложения, добавил Guice и получил мою инъекцию, а также мои объекты домена. Затем я продолжил добавлять веб-сервисы через Jersey/Grizzly. Как вы могли бы сказать из моего стиля кодирования, я пришел из фона C#. Поэтому я уверен, что часть моей борьбы учит Джавасу делать что-то.исключение интеграции Guice Guice

Что я хочу, так это то, что мои классы без веб-сервисов могут быть введены в обработчики веб-сервисов, чтобы они могли использовать функциональность, которую я создал.

В моем классе ниже, у меня есть обработчик экземпляра базы данных Я хочу, чтобы ввести в классы 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 
    } 
} 

Я попытался добавить в GuiceBridge и обязательным, что в моем расширении класса ResourceConfig. Но независимо от того, какую версию я использовал, я получаю некоторые сумасшедшие исключения об отсутствующих свойствах, когда я пытался инициализировать веб-службы. Простое удаление GuiceBridge из моего pom.xml удаляет исключение. Это похоже на проблему совместимости с версией, но я не понимаю, какая версия библиотеки.

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) 

И мой 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> 

Прошу прощения, я не могу объяснить эту проблему с более окончательным вот что случилось. Возможно, я неправильно сконфигурировал приложение, и, учитывая это, я просто изучаю, я в порядке с этим. Я бы хотел, чтобы не переписывать мои логические конструкции и модульные тесты.

Спасибо за вашу помощь Matt

ответ

0

Ошибка объяснения

java.lang.NoSuchMethodError, безусловно, ошибка с пакетами и версиями библиотеки. Это означает, что вы скомпилировали код, ссылающийся на метод, который не существует в вашем коде времени выполнения.

Это не ошибка, обычно встречающаяся в вашем коде, потому что компилятор не позволит вам передать код, ссылающийся на несуществующий метод. Но в этом случае код, ссылающийся на метод и ссылочный код, являются обеими библиотеками, поэтому это означает, что код с ссылкой на метод был скомпилирован против другой версии целевого класса.

Как-то эта ошибка аналогична более распространенной ClassNotFoundException. Но вместо того, чтобы не находить класс, вы не находите метод внутри класса.

найти источник вашей проблемы

Теперь вы знаете, в чем проблема. Исправить это, я боюсь, не так просто. Управление пакетами и разрешение библиотеки с помощью Java становятся все труднее с каждым годом. Я вижу, вы используете bom (Bill of Materials) для библиотеки Джерси. Кроме того, ваш файл pom не является простым. Я предлагаю вам создать тестовый проект только со структурой вашего кода API (jax-rs) с Guice и мостом HK2-Guice. Может быть, вместо того, чтобы с помощью BOM попробовать это последние версии, они работают для меня:

  • com.google.inject: Guice: 4.1.0
  • org.glassfish.jersey.containers: джерси-контейнеровоз-сервлета: 2.25
  • org.glassfish.hk2: Guice мост:. 2,5 +

Я использую сервлета контейнер, но вы используете автономный один. Это не имеет значения, используйте ваш, но сохраните номер версии.

разрешение Maven

Также попробуйте проверить, какую версию каждого пакета, который вы в том числе в финальной сборке. Вы можете найти полезную команду это Maven для отображения дерева зависимостей:

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

+0

Это большое объяснение. Я прошу прощения, это вопрос новичков. Как мне не использовать спецификацию? – tatmanblue

+0

@tatmanblue Легко. Вы удаляете объявление bom и добавляете версию для каждой зависимости. Спецификация - это просто _meta-dependency_, которая дает вам точные версии. Посмотрите на '' деклараций без ''. Для получения дополнительной информации см. [Http://stackoverflow.com/questions/14874966/how-to-use-bom-file-with-maven] (этот вопрос). – sargue

+0

Спасибо. Удаление спецификации, установка определенных номеров версий для зависимостей, когда вы выкрикивали, устранила мою проблему. Теперь я могу получить доступ к своим веб-сервисам из браузера без ошибок (мне пришлось добавить одну зависимость для сериализации json) – tatmanblue