Search code examples
javajerseyguicehk2

Another Guice + Jersey error NoSuchMethodError


Well, GeneralUtilities does not even have the method getSystemProperty so not so weird it fails.

What is the best way to handle this? Deploying on Liberty Profile.

Error:

[1/12/16 15:01:58:482 CET] 00000027 com.ibm.ws.webcontainer.servlet                              E SRVE0271E: Uncaught init() exception created by servlet [Jersey Web Application] in application [Agent-1.0.0-SNAPSHOT]: 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.servlet.WebComponent.<init>(WebComponent.java:338)
      at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:171)
      at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:363)
      at javax.servlet.GenericServlet.init(GenericServlet.java:244)
      at com.ibm.ws.webcontainer.servlet.ServletWrapper.init(ServletWrapper.java:332)
      at com.ibm.ws.webcontainer.servlet.ServletWrapper.loadOnStartupCheck(ServletWrapper.java:1423)
      at com.ibm.ws.webcontainer.webapp.WebApp.doLoadOnStartupActions(WebApp.java:1180)
      at com.ibm.ws.webcontainer.webapp.WebApp.commonInitializationFinally(WebApp.java:1148)
      at com.ibm.ws.webcontainer.webapp.WebApp.initialize(WebApp.java:1054)
      at com.ibm.ws.webcontainer.webapp.WebApp.initialize(WebApp.java:6448)
      at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost.startWebApp(DynamicVirtualHost.java:446)
      at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost.startWebApplication(DynamicVirtualHost.java:441)
      at com.ibm.ws.webcontainer.osgi.WebContainer.startWebApplication(WebContainer.java:980)
      at com.ibm.ws.webcontainer.osgi.WebContainer.startModule(WebContainer.java:804)
      at com.ibm.ws.app.manager.web.internal.WebModuleHandlerImpl.deployModule(WebModuleHandlerImpl.java:102)
      at com.ibm.ws.app.manager.module.internal.DeployedAppInfoBase.deployModule(DeployedAppInfoBase.java:874)
      at com.ibm.ws.app.manager.module.internal.DeployedAppInfoBase.deployModules(DeployedAppInfoBase.java:834)
      at com.ibm.ws.app.manager.module.internal.DeployedAppInfoBase.deployApp(DeployedAppInfoBase.java:821)
      at com.ibm.ws.app.manager.war.internal.WARApplicationHandlerImpl.install(WARApplicationHandlerImpl.java:80)
      at com.ibm.ws.app.manager.internal.statemachine.StartAction.execute(StartAction.java:139)
      at com.ibm.ws.app.manager.internal.statemachine.ApplicationStateMachineImpl.enterState(ApplicationStateMachineImpl.java:1168)
      at com.ibm.ws.app.manager.internal.statemachine.ApplicationStateMachineImpl.run(ApplicationStateMachineImpl.java:781)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1143)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:618)
      at java.lang.Thread.run(Thread.java:785)

JerseyConfig

import com.google.inject.Guice;
import com.google.inject.Injector;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;

import javax.inject.Inject;

public class JerseyConfig extends ResourceConfig {

    @Inject
    public JerseyConfig(ServiceLocator locator) {
        packages("no.services.agent");

        GuiceBridge.getGuiceBridge().initializeGuiceBridge(locator);
        // add your Guice modules.
        Injector injector = Guice.createInjector(new GuiceModule());
        GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(injector);
    }
}

SelftestResource

@Path("/")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.TEXT_XML, MediaType.TEXT_HTML})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.TEXT_XML, MediaType.TEXT_HTML})
public class SelftestResource {

    @GET
    public Response selftest(){
        return Response.ok().build();
    }
}

web.xml

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.services.agent.guice.JerseyConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

pom.xml

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

<dependency>
  <groupId>com.google.inject.extensions</groupId>
  <artifactId>guice-servlet</artifactId>
  <version>3.0</version>
</dependency>
<dependency>
  <groupId>org.glassfish.hk2</groupId>
  <artifactId>guice-bridge</artifactId>
  <version>2.4.0</version>
</dependency>
<dependency>
  <groupId>com.google.inject.extensions</groupId>
  <artifactId>guice-multibindings</artifactId>
  <version>3.0</version>
</dependency>


<dependency>
  <groupId>org.glassfish.jersey.containers</groupId>
  <artifactId>jersey-container-servlet-core</artifactId>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-moxy</artifactId>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
</dependency>
</dependencies>

Solution

  • Based on what you said I believe the fix is to use the 2.4.0-b31 version of the guice-bridge