我在tomcat 8上使用了运动衫2.17,我认为应该是一个非常简单和常见的用例,我有一个问题。
我在spring文件中定义了各种bean。我现在已经对其中一个进行了注释,以便将一些方法公开为rest。这是一个单例bean,它引用在spring配置中注入的另一个bean。
我的rest正在工作,但问题是每次调用一个bean类的新实例时,我的bean引用都是空的。我的理解是,这是因为jersey正在管理生命周期,而不是spring,我需要SpringComponentProvider,然后它将提供单例。
我在我的应用程序中包含了jersey- spring 3-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,如果修复了它,我将关闭它。
发布于 2015-08-07 01:26:28
当我终于能够更新我的春天时,事实证明这不是问题所在。我必须将@Component和@Singleton添加到我的资源中,这样泽西才能将它识别为一个弹簧管理的单例。如果我在spring中使用注释,那么这个问题就不会出现;它之所以发生,是因为我使用XML创建spring。
发布于 2015-05-01 19:02:37
泽西将在每个调用上创建一个新实例,而不管在spring上下文中是否具有与singleton相同类的XML:
https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e2331
还可以看到关于如何更改该行为的响应:
https://stackoverflow.com/a/14739010/2879838
在泽西资源类中,由于您已经添加了jersey-spring依赖项,所以您可以简单地将@Autowire注释添加到您的成员变量上,您说这个注释是在spring通过XML文件注入的。这将在泽西在每个请求上实例化资源时注入依赖项。
希望这能有所帮助。
https://stackoverflow.com/questions/29905624
复制相似问题