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)
此外,我发现上面的行没有任何意义,即使我完全删除它与控制器的寄存器一切正常。
- 使用Google Guice和静态方法注入Util类?
- @Bean和@Autowired之间的区别
- Guice:使用属性绑定注释
- 在IoC容器中将依赖项设置为NULL并在运行时提供依赖项是不好的做法?
- 是否可以将包中的所有类注册为Spring bean
- 在Android中“注入一切”是一种不好的做法吗?
- ClassCastException:org.springframework.orm.jpa.EntityManagerHolder无法强制转换为org.springframework.orm.hibernate5.SessionHolder
- 记录Spring bean创建/dependency injection
- 使用自定义hk2 InjectionResolver注入应用程序配置