【问题标题】:@Inject does not work with spring 5 jersey 2.29.1, but @Autowire does@Inject 不适用于 spring 5 jersey 2.29.1,但 @Autowire 可以
【发布时间】: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 配置更新了问题

标签: spring jersey payara


【解决方案1】:

在我的情况下,问题与部署到 Payara 时未禁用隐式 cdi 标志有关。关了就没事了。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2014-09-04
    • 2019-08-09
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多