2016-07-01 9 views
0

현재 웹 프로젝트에서 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 패키지가 내 서비스를 자동으로 등록하게하려면 누락 된 부분이 있습니까?

+0

로케이터가 서비스가 있는지 확인 했습니까? 'locator.getService (Service.class)' –

+0

코드에 [확인 추가] (http://stackoverflow.com/q/34433454/2587435)를 사용하여 경고를 남기거나 경고를 보내거나 실패 할 수 있습니다. 이렇게하면 설정으로 무엇인가를 수정해야한다는 것을 알 수 있습니다. –

+0

추가 빌드 단계 *를 피하려고한다고 말하는 것은 무엇을 의미합니까? 'META-INF/hk2-locator/default'가 생성되어야합니다. 이것은 당신이 링크 한 의사가하는 모든 것입니다. HK2는 런타임 중에이 파일을 읽고'@ Service' 주석 클래스를 제공합니다. 런타임 중에이 정보를 생성 할 방법을 찾고 있습니까? 그렇다면 왜 표준 주입 주석을 사용하지 않으시겠습니까? –

답변

1

내 인터페이스에 장식가로 잘못된 @Contract을 사용하고있는 것으로 나타났습니다. org.jvnet.hk2.annotations.Contract 대신 org.glassfish.jersey.spi.Contract을 사용하고있었습니다.