2016-07-01 4 views
0

В настоящее время я использую Джерси, Grizzly и Gradle в веб-проекте, и я пытаюсь получить инъекцию зависимостей, работая с HK2. Я выполнил инструкции в документации (https://hk2.java.net/2.5.0-b04/inhabitant-generator.html) для получения генератора метаданных HK2, работающего с Gradle. Однако, когда я запускаю свое приложение, я получаю следующее исключение:Проблемы с HK2 Inject

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. Есть ли что-то, что мне не хватает, чтобы пакет HK2 Metadata Generator автоматически регистрировал мои службы при запуске моего приложения?

+0

Вы проверили локатор, чтобы узнать, есть ли у вас службы? 'locator.getService (Service.class)' –

+0

Вы можете [добавить чек] (http://stackoverflow.com/q/34433454/2587435) в свой код, чтобы убедиться, и, возможно, зарегистрировать предупреждение или просто выйти из строя. Таким образом, вы знаете, что вам нужно что-то исправить при настройке. –

+0

Что вы имеете в виду, говоря, что хотите избежать * дополнительного шага сборки *? Вам нужно создать «META-INF/hk2-locator/default», правильно? Это то, о чем вы связывали документ. HK2 будет читать этот файл во время выполнения и обслуживать аннотированные классы '@ Service'. Вы ищете способ генерации этой информации во время выполнения? Если да, почему бы вам не использовать стандартные аннотации для инъекций? –

ответ

1

Получается, что я использовал неправильный @Contract декоратор для моего интерфейса. Я использовал org.glassfish.jersey.spi.Contract вместо org.jvnet.hk2.annotations.Contract.