另一个 Guice + Jersey 错误 NoSuchMethodError

Another Guice + Jersey error NoSuchMethodError

好吧,GeneralUtilities 甚至没有 getSystemProperty 方法,所以不会很奇怪地失败。

处理此问题的最佳方法是什么? 在 Liberty Profile 上部署。

错误:

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

泽西配置

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);
    }
}

自测资源

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

根据您所说的,我认为解决方法是使用 guice-bridge

的 2.4.0-b31 版本