我在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,如果修复了它,我将关闭它。
答案 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。