Jersey2,Hk2dependency injection(自动)给出AbstractMethodError:org.jvnet.hk2.internal.DynamicConfigurationImpl.addIdempotentFilter

坚持这个问题一段时间。 我正在尝试集成Tomcat 9,JDK 10,Jersey 2.23,HK2(用于DI)以及自动dependency injection。 我已经按照本教程 ,但得到以下错误,我搜索了很多,但没有找到任何东西。

我已经使用依赖来生成“META-INF / hk2-locator / default”,它正在生成。

依赖

 org.glassfish.hk2 hk2-metadata-generator 2.4.0  

错误堆栈

 SEVERE: Servlet [MyApplication] in web application [/javaeeLearning] threw load() exception java.lang.AbstractMethodError: org.jvnet.hk2.internal.DynamicConfigurationImpl.addIdempotentFilter([Lorg/glassfish/hk2/api/Filter;)V at org.glassfish.hk2.utilities.ServiceLocatorUtilities.addClasses(ServiceLocatorUtilities.java:451) at org.glassfish.hk2.utilities.ServiceLocatorUtilities.enablePerThreadScope(ServiceLocatorUtilities.java:107) at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:141) at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:123) at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:330) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:392) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1124) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1079) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:971) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4829) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5143) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Catalina.start(Catalina.java:682) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492) 

自动DI代码

 import java.io.IOException; import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; import org.glassfish.hk2.api.DynamicConfigurationService; import org.glassfish.hk2.api.MultiException; import org.glassfish.hk2.api.Populator; import org.glassfish.hk2.api.ServiceLocator; import org.glassfish.hk2.utilities.ClasspathDescriptorFileFinder; import org.glassfish.hk2.utilities.DuplicatePostProcessor; import org.glassfish.jersey.ServiceLocatorProvider; //This class will cause the HK2 framework to scan your classpath for inhabitants files that are created using the hk2-inhabitant-generator. public class MyDiscoverableFeature implements Feature { @Override public boolean configure(FeatureContext context) { ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(context); DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class); Populator populator = dcs.getPopulator(); try { populator.populate(new ClasspathDescriptorFileFinder(this.getClass().getClassLoader()), new DuplicatePostProcessor()); } catch (IOException | MultiException ex) { System.out.println("exception occurred " + ex); } return true; } } public class ResourceConfiguration extends ResourceConfig { public ResourceConfiguration() { // register(ControllerTest.class); // register(new MyBinder()); this.packages(true, "com.walmart.services.*"); // for auto scan register(MyDiscoverableFeature.class); } } 

我有一个用org.jvnet.hk2.annotations.Contract(@Contract)注释的接口“IUserService”,带有用org.jvnet.hk2.annotations.Service(@Service)注释的implmentation“UserServiceImpl”

我有一个控制器类:

 @Path("/sayHello") public class ControllerTest { @Inject private IUserService service; @Inject private ServicesTest service2; @GET @Path("/{name}") @Produces(MediaType.TEXT_PLAIN) public String method(@PathParam("name") String msg) { return service.method() + msg; } @GET @Path("/v2/{name}") @Produces(MediaType.TEXT_PLAIN) public String method2(@PathParam("name") String msg) { return service.method() + msg; } } 

以及下面的依赖项

    javax javaee-api 8.0      org.glassfish.jersey.core jersey-server ${jersey2.version}   org.glassfish.hk2 hk2-utils   org.glassfish.hk2 hk2-api   org.glassfish.hk2.external javax.inject      org.glassfish.jersey.core jersey-common ${jersey2.version}   org.glassfish.hk2 hk2-utils   org.glassfish.hk2 hk2-api   org.glassfish.hk2.external javax.inject     org.glassfish.jersey.containers jersey-container-servlet ${jersey2.version}   org.glassfish.hk2.external javax.inject       org.glassfish.jersey.inject jersey-hk2 2.27    org.glassfish.jersey.media jersey-media-json-jackson ${jersey2.version}     org.glassfish.hk2 hk2-metadata-generator 2.4.0   

更新

我删除依赖冲突后立即修复上述问题。

但是现在,我的其余资源根本没有被检测到,所以我的rest资源上有404错误。

但是,如果我在“ResourceConfiguration”//注册(ControllerTest.class)中取消注释这一行; 然后它开始出现。

但我不想为每个singelrest资源做这个(不实用)请帮助解决这个问题

@PaulSamsotha; 如你所提到的那样改变;

 this.packages(true, "com.walmart.services.*"); 

 this.packages(true, "com.walmart.services"); 

在服务器启动时给出以下错误;

这是完整的错误;

不知道它的原因但是一旦我删除“。*”,在服务器启动时我得到以下错误。

 Sep 27, 2018 2:42:49 PM org.apache.catalina.core.StandardContext loadOnStartup SEVERE: Servlet [MyApplication] in web application [/javaeeLearning] threw load() exception java.lang.IllegalArgumentException at jersey.repackaged.org.objectweb.asm.ClassReader.(ClassReader.java:170) at jersey.repackaged.org.objectweb.asm.ClassReader.(ClassReader.java:153) at jersey.repackaged.org.objectweb.asm.ClassReader.(ClassReader.java:424) at org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener.process(AnnotationAcceptingListener.java:170) at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:915) at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:869) at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:775) at org.glassfish.jersey.server.ResourceConfig$WrappingResourceConfig._getClasses(ResourceConfig.java:1147) at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:775) at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.(ResourceConfig.java:1206) at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.(ResourceConfig.java:1178) at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1174) at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:345) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:392) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1124) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1079) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:971) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4829) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5143) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Catalina.start(Catalina.java:682) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492) 

此外,我发现上面的行没有任何意义,即使我完全删除它与控制器的寄存器一切正常。