如何让spring管理bean生命周期而不是jersey

时间:2015-04-27 20:45:44

标签: java spring jersey

我在tomcat 8上使用了jersey 2.17,而且我对我认为应该是一个非常简单和常见的用例有疑问。

我在spring XML文件中定义了各种bean。我现在注释其中一个将一些方法暴露为其他API。这是一个单例bean,引用了另一个在spring XML配置中注入的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,如果修复了它,我将关闭它。

2 个答案:

答案 0 :(得分:1)

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

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

另请参阅有关如何更改此行为的回复:

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

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

希望这有帮助。

答案 1 :(得分:1)

当我终于能够更新我的春天时,结果证明这不是问题。我必须将@Component以及@Singleton添加到我的资源中,以便让球衣将其识别为弹簧管理的单身人士。如果我使用春天的注释,这个问题永远不会出现;它发生是因为我使用XML来创建spring bean。

相关问题