2016-03-29 16 views
1

Ich habe eine Spring Boot-Anwendung mit Jersey 2 REST-Diensten. Spring Boot scheint korrekt zu initialisieren und ich habe Jersey Spring bridge ('org.glassfish.jersey.ext: jersey-spring3: 2.22.2'). Trotzdem wird der folgende Fehler ausgelöst, dann wird der REST-Controller (JAX-RS 2.0) initialisiert und ein Spring Bean muss hineingejagt werden.HK2 sieht keine Frühlingsbohnen

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

Was kann einen solchen Fehler verursachen?

Die Bean ist vorhanden und mit @named annotiert, also ist es nicht das Problem. Spring Boot sucht standardmäßig auch nach JSR-330-Annotationen.

Edit: Initialisierung erfolgt mit:

@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:

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 

Der Controller ist:

@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

Wo ist Ihr 'RequestEventLogger'? Ich kann Ihnen sagen, dass Spring Service in Jersey/HK2-Ressourcen/Dienstleistungen kein Problem mit Spring Boot ist. Woher weißt du, dass der Logger tatsächlich im Spring-Kontext ist? Haben Sie versucht, 'ApplicationContext' zu injizieren und explizit' ctx.getBean (RELogger.class) 'zu versuchen, um zu sehen, ob es im Kontext ist? –

+0

@peeskillet Sie haben Recht. Ich habe versucht, dass Sie vorgeschlagen und Spring ist nicht in der Lage, die Klasse zu finden. Es ist ein einfacher Klassengedanke mit \ @Named Annotation, also sollte es von Spring aufgenommen worden sein. – Sergey

+0

In welchem ​​Paket ist der Logger? Es sollte im gleichen Paket wie die Anwendungsklasse oder in einem Unterpaket sein, damit es im Scan abgeholt werden kann. –

Antwort

2

Das eigentliche Problem war etwas in den Kommentaren entdeckt (es wurde nicht in der ursprünglichen Frage gezeigt).

Mit @SpringBootApplication (ein Alias ​​für drei Anmerkungen, einschließlich @ComponentScan), erhalten Sie kostenlose Komponente Scan mit Spring. Aber wie der Komponentenscan funktioniert (ohne dass zu durchsuchende Pakete spezifiziert werden) ist, dass es das Paket der annotierten Klasse @ComponentScan und seine Unterpakete scannt. Aus diesem Grund wird empfohlen, die „Anwendung“ Klasse in einem Root-Paket zu setzen, und haben alle anderen Pakete als Unterpakete des Pakets, zB

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

Mit dieser Einrichtung, alle Pakete erhalten Nach annotierten Komponentenklassen gescannt. Ich nehme an, das OP hat es nicht so eingerichtet, also wurden die Spring-Komponenten nicht im Scan aufgenommen.