java - 如何让 Spring 管理 bean 生命周期而不是 jersey

标签 java spring jersey

我在 tomcat 8 上使用 jersey 2.17,并且我认为应该是一个非常简单且常见的用例,但遇到了问题。

我在 spring XML 文件中定义了各种 bean。我现在已经对其中之一进行了注释,以将一些方法公开为 REST API。这是一个单例 bean,引用了 spring XML 配置中注入(inject)的另一个 bean。

我的其余 API 正在工作,但问题是每次调用时都会创建一个 bean 类的新实例,而我的 bean 引用为 null。我的理解是,这是因为 jersey 正在管理生命周期而不是 spring,并且我需要 SpringComponentProvider,它将提供单例。

我在应用程序中包含了jersey-spring3-2.17.jar,并在web.xml中的servlet配置中指定了spring包,如下所示:

    <servlet>
        <servlet-name>Jersey REST Service</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.rest.package;org.glassfish.jersey.server.spring</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.tracing.type</param-name>
            <param-value>ALL</param-value>
        </init-param>        
        <load-on-startup>1</load-on-startup>
    </servlet>

我知道 jersey.config.server.provider.packages 参数正在被选取,因为找到了 my.rest.package 中带注释的类,但 SpringComponentProvider 显然没有被注册,因为我仍然得到每次都是我的 bean 的新实例。

我尝试像这样显式指定类:

    <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.server.spring.SpringComponentProvider</param-value>
    </init-param>

这也没有改变行为。

任何见解或调试建议表示赞赏。

更新:我意识到我的 spring jar 的版本落后于我的 Jersey jar 预期的版本,我认为这就是问题所在。一旦我能够更新 spring,如果修复了它,我将关闭它。

最佳答案

Jersey 将在每次调用时创建一个新实例,无论您是否有与 spring 上下文中的单例相同类的 XML bean:

https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e2331

另请参阅有关如何更改该行为的响应:

https://stackoverflow.com/a/14739010/2879838

在 Jersey Resource 类中,由于您已经添加了 jersey-spring 依赖项,因此您只需在您所说的通过 Spring 中的 XML 文件注入(inject)的成员变量上添加 @Autowire 注释即可。当 Jersey 在每个请求上实例化资源时,这将通过 Spring 注入(inject)依赖项。

希望这有帮助。

关于java - 如何让 Spring 管理 bean 生命周期而不是 jersey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29905624/

相关文章:

java - 在处理中查找并播放视频文件

java - 如何使Spring应用程序的业务逻辑用户可配置?

java - Spring Boot Soap Web 服务(Java)-代码优先?

java - Jersey:处理 Restful HTTP PUT(更新)请求的最佳实践

javax servlet 过滤器与 Jersey 过滤器

maven - jersey-server-1.12 与 jetty-maven-plugin 不能一起工作

java - 如何使用jsf 2.0显示带有空白行的数据表

java - 如何让我的输出包含我需要的空格?

java - 如何使用 Hibernate\Spring Data 将 json 转换为 java 对象数据并保存到数据库中?

java - 将 Maven 构建从 Jenkins 发布到 Artifactory