Spring HK2没有看到春豆
我有一个带有Jersey 2 REST服务的Spring Boot应用程序。 Spring Boot似乎初始化正确,我有Jersey Spring bridge('org.glassfish.Jersey.ext:Jersey-spring3:2.22.2')。 尽管如此,仍然会抛出以下错误,然后REST控制器(JAX-RS2.0)被初始化,并且必须向其中注入SpringbeanSpring HK2没有看到春豆,spring,spring-boot,jersey-2.0,hk2,Spring,Spring Boot,Jersey 2.0,Hk2,我有一个带有Jersey 2 REST服务的Spring Boot应用程序。 Spring Boot似乎初始化正确,我有Jersey Spring bridge('org.glassfish.Jersey.ext:Jersey-spring3:2.22.2')。 尽管如此,仍然会抛出以下错误,然后REST控制器(JAX-RS2.0)被初始化,并且必须向其中注入Springbean org.glassfish.hk2.api.UnsatisfiedDependencyException: Ther
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection
什么会导致这样的错误
bean是存在的,并用@Named注释,因此这不是问题所在。springboot默认也会扫描JSR-330注释
编辑:
初始化通过以下方式完成:
@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>
控制器是:
@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();
}
}
实际问题是在评论中发现的(原始问题中没有显示) 使用
@SpringBootApplication
(三个注释的别名,包括@ComponentScan
),您可以使用Spring免费进行组件扫描。但是组件扫描的工作原理(不指定要扫描的包)是它将扫描@ComponentScan
注释类的包及其子包。因此,建议将“application”类放在根包中,并将所有其他包作为该包的子包,例如
com.app
Application
com.app.services
LoggingService
com.app.repos
UserRepo
通过此设置,所有包都会被扫描以查找带注释的组件类。我猜OP没有这样设置,所以在扫描中没有检测到Spring组件 您的
RequestEventLogger
在哪里?我可以告诉您,将Spring服务注入Jersey/HK2资源/服务并不是Spring Boot的问题。您如何知道记录器确实在Spring上下文中?您是否尝试过注入ApplicationContext
并尝试显式地ctx.getBean(RELogger.class)
以查看它是否在上下文中?@peeskillet您是对的。我按照你的建议试过了,Spring也找不到这个班。这是一个带有\@命名注释的简单类,因此应该由Spring获取。记录器在哪个包中?它应该与应用程序类位于同一个包中,或者位于子包中,以便在scan@peeskillet这就是一揽子计划的问题。我把应用程序类一的软件包向上移动,突然间一切都正常了。谢谢。你想发布一个答案,还是我应该先重新措辞这个问题?我得到了同样的错误,但修复不适合我。我按照这里的解决方案重新排列了这些类,但仍然得到相同的错误。我的配置与问题中所述的类似。有什么帮助吗?@AndyDufresne发布了一个新的详细问题以获得更好的帮助。显然,错误是因为依赖注入。未注入依赖项,因此触发了上述错误。谢谢
com.app
Application
com.app.services
LoggingService
com.app.repos
UserRepo