java - HK2 注入(inject)问题

标签 java dependency-injection jersey grizzly hk2

我目前在一个 Web 项目中使用 Jersey、Grizzly 和 Gradle,并尝试使用 HK2 进行依赖注入(inject)。我已按照文档 ( https://hk2.java.net/2.5.0-b04/inhabitant-generator.html ) 中的说明让 HK2 元数据生成器与 Gradle 配合使用。但是,当我运行我的应用程序时,出现以下异常:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=IApiKeyRepository,parent=AuthService,qualifiers={},position=-1,optional=false,self=false,unqualified=null,293474277)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:75)
at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:211)
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:234)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2020)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:693)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:78)
at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:211)
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:234)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2020)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at org.glassfish.jersey.internal.inject.Providers.getAllRankedProviders(Providers.java:247)
at org.glassfish.jersey.server.ApplicationHandler.getProcessingProviders(ApplicationHandler.java:772)
at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:537)
at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184)
at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350)
at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:347)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.<init>(GrizzlyHttpContainer.java:349)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:238)
at com.neuro.track.web.api.ApplicationConfig.main(ApplicationConfig.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

如您所见,DI 不起作用。我的应用程序的 main 方法如下所示:

public static void main(String[] args) throws Exception {
    final ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
    final ResourceConfig resourceConfig = new ApplicationConfig();
    resourceConfig.packages("com.package")
    final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig, locator);

    Runtime.getRuntime().addShutdownHook(new Thread(server::shutdownNow));

    server.start();
}

我的假设是 HK2 元数据生成器包将扫描我的项目并自动注册所有用 @Service 类注释的类,而无需我显式注册这些类。但是,我所做的任何事情都不会导致这些服务注册。我真的想避免自己手动添加服务类,因为这个项目将会变得相当大。另外,我试图避免使用 HK2 Inhabitant Generator 库进行额外的构建步骤。为了让 HK2 元数据生成器包在运行我的应用程序时自动注册我的服务,我是否缺少某些内容?

最佳答案

事实证明,我在界面中使用了错误的 @Contract 装饰器。我使用的是 org.glassfish.jersey.spi.Contract 而不是 org.jvnet.hk2.annotations.Contract

关于java - HK2 注入(inject)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38135676/

相关文章:

java - 如何在android中的MVP层之间使用注入(inject)?

javascript - 文件上传 API 可与 Postman 配合使用,但不能与 AngularJS 配合使用

java - 具有出色 UI 的桌面应用程序 - 平台决策

java - 我正在尝试使用 jLabel 和 setText 方法设置 int 值

java - 如何在 Java 中创建锯齿状的二维数组?

java - 如何导入来自以另一个类为条件的配置 bean 的 bean?

spring - 将依赖注入(inject)与 Play 框架一起使用的示例用例

java - 将 Jersey 资源部署到 Servlet 3.0 API 感知容器中失败得很惨

java - 带有 Jersey : Passing form parameters to PUT method for updating a Resource 的 JAX-RS

java - Struts2 + Sitemesh + Freemarker 不起作用