현재 웹 프로젝트에서 Jersey, Grizzly 및 Gradle을 사용하고 있으며 HK2에서 작동하는 종속성 인젝션을 시도하고 있습니다. 필자는 설명서의 지침 (https://hk2.java.net/2.5.0-b04/inhabitant-generator.html)을 따라 HK2 메타 데이터 생성기가 Gradle과 작동하도록했습니다. 그러나 응용 프로그램을 실행할 때 예외가 발생합니다.HK2 인젝션 관련 문제
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 패키지가 내 서비스를 자동으로 등록하게하려면 누락 된 부분이 있습니까?
로케이터가 서비스가 있는지 확인 했습니까? 'locator.getService (Service.class)' –
코드에 [확인 추가] (http://stackoverflow.com/q/34433454/2587435)를 사용하여 경고를 남기거나 경고를 보내거나 실패 할 수 있습니다. 이렇게하면 설정으로 무엇인가를 수정해야한다는 것을 알 수 있습니다. –
추가 빌드 단계 *를 피하려고한다고 말하는 것은 무엇을 의미합니까? 'META-INF/hk2-locator/default'가 생성되어야합니다. 이것은 당신이 링크 한 의사가하는 모든 것입니다. HK2는 런타임 중에이 파일을 읽고'@ Service' 주석 클래스를 제공합니다. 런타임 중에이 정보를 생성 할 방법을 찾고 있습니까? 그렇다면 왜 표준 주입 주석을 사용하지 않으시겠습니까? –