【发布时间】:2019-09-17 10:02:06
【问题描述】:
我有一个使用 JSF Spring5 Jersey2.29.1 (spring-jersey5) 在 Payara 5.1.3 上运行的 Web 应用程序。
DI 部分由 Spring 处理,它使用 @Inject。
我的问题是,由于我在球衣端点上从 Jersey2.25 Spring-Jersey4 和 Payara 4.1.9.2 迁移,我不能将 @Inject 用于 spring bean,我必须使用 @Autowired。
我收到的错误是:
Severe: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type MyService with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private my.company.rest.internal.workflowengine.LeaveFlowEndpoint.myService
我猜这与执行注入(HK2)的库有关,当使用 @Inject 时试图解决依赖关系本身而不是在 spring 中寻找它。
相反,如果我使用 @Autowired 就像一个魅力。
知道为什么我会得到这个吗?
PS hk2版本是2.29.1
web.xml 配置:
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>my.company.endpoints.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
我必须在这里使用其他(spring-aware)类吗:
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
?
【问题讨论】:
-
因为您没有正确设置 Spring/Jersey 集成。这里的
@Inject不是由 Spring 处理的,这里是 @Autowired。因此,您可能最终得到了 2 个 bean 实例,一个由 Jersey 管理,一个由 Spring 管理。 -
用 web.xml 配置更新了问题