2016-03-29 33 views
1

Jersey 2 REST hizmetleriyle bir Spring Boot uygulamasına sahibim. Spring Boot, doğru şekilde başlatılıyor gibi görünüyor ve Jersey Spring köprüsüm var ('org.glassfish.jersey.ext: jersey-spring3: 2.22.2'). Buna rağmen, aşağıdaki hata atılır, daha sonra REST denetleyicisi (JAX-RS 2.0) başlatılır ve bir Spring Bean'in içine enjekte edilmesi gerekir.HK2, Spring Bean'leri görmez

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection 

Böyle bir hataya neden olabilir?

Fasulye, @Aded ile mevcut ve açıklamalı, bu yüzden sorun değil. Spring Boot varsayılan olarak JSR-330 ek açıklamalarını da tarar.

Düzenleme:

@SpringBootApplication 
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer { 

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(Application.class); 
} 
} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    version="3.1"> 

    <servlet> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

StackTrace: başlatma kullanılarak yapılır

DEBUG o.glassfish.jersey.server.ServerRuntime$Responder - An exception mapping did not successfully produce and processed a response. Logging the exception propagated to the container. 
org.glassfish.hk2.api.MultiException: A MultiException has 3 exceptions. They are: 
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=RequestEndEventLogger,parent=RequestEndEventController,qualifiers={},position=-1,optional=false,self=false,unqualified=null,125747480) 
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.company.controller.RequestEndEventController errors were found 
3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.company.controller.RequestEndEventController 

at org.jvnet.hk2.internal.Collector.throwIfErrors(Collector.java:89) 
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:249) 
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:2022) 
at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:765) 
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:704) 
at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172) 
at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:284) 
at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:74) 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:109) 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) 
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:92) 
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:61) 
at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197) 
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:318) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
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.process(Errors.java:267) 
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:120) 
at org.springframework.boot.context.web.ErrorPageFilter.access$000(ErrorPageFilter.java:61) 
at org.springframework.boot.context.web.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:95) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:113) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500) 
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=RequestEndEventLogger,parent=RequestEndEventController,qualifiers={},position=-1,optional=false,self=false,unqualified=null,125747480) 
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) 
... 80 common frames omitted 

denetleyicisidir:

@Named 
@Singleton 
@Path("/RequestEndEvent") 
public class RequestEndEventController { 

    private final Logger log = LoggerFactory.getLogger(getClass()); 
    @Inject 
    private RequestEndEventLogger logger; 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response sendRequestEndEvent(RequestEndEvent requestEndEvent) { 
     logger.addRequestEndEvent(requestEndEvent); 
     return Response.status(Response.Status.OK).build(); 
    } 
} 
+0

'RequestEventLogger' nedir? Spring hizmetlerini Jersey/HK2 kaynaklarına/hizmetlerine enjekte etmenin Spring Boot ile ilgili bir sorun olmadığını söyleyebilirim. Logger'ın gerçekten Spring bağlamında olduğunu nereden biliyorsunuz? 'ApplicationContext' enjekte etmeyi denediniz mi ve bağlamda olup olmadığını görmek için açıkça 'ctx.getBean (RELogger.class)' denmeye çalıştınız mı? –

+0

@peeskillet Haklısınız. Önerdiğini denedim ve Spring de sınıfı bulamıyor. \ @Adlandırılmış bir açıklama ile düşünülen basit bir sınıftır, bu yüzden Spring tarafından alınmalıdır. – Sergey

+0

Logger hangi pakette? Uygulama sınıfıyla aynı pakette ya da bir alt pakette, taramada ( –

cevap

2

Asıl sorun, yorumlarda keşfedilen bir şeydi (orijinal soruda gösterilmedi).

@SpringBootApplication ile (@ComponentScan dahil olmak üzere üç ek açıklama için diğer ad), Spring ile birlikte ücretsiz bileşen taraması alırsınız. Ancak bileşen taraması nasıl çalışır (taranacak paketleri belirtmeksizin), @ComponentScan10 ek açıklamalı sınıfın paketini ve alt paketlerini tarar. Bu nedenle, ile

com.app 
    Application 
com.app.services 
    LoggingService 
com.app.repos 
    UserRepo 

kurmak örneğin bütün paketler olsun, bir kök paketinde "uygulaması" sınıfı koymak ve bu paketin alt paketler olarak tüm diğer paketleri olması tavsiye edilir açıklamalı bileşen sınıfları için taranmıştır. Bence OP bu şekilde ayarlamamıştı, bu yüzden Spring bileşenleri taramaya alınmadı.