我确信这很可能是一个愚蠢的问题,但我不熟悉JAX RS(和泽西岛)。
我们有一个基本上启动RESTful服务的独立Java应用程序。作为重构的一部分,我们已将此应用程序移动到另一个应用程序中的一个线程。另一个应用程序使用在application-context.xml中定义的Spring bean。所以,我需要将一些bean注入资源类(如果它是正确的名称:带有@Path注释的那个,等等)。问题是我不知道实例化这个特定类是什么。遗留应用程序的一个主要类是使用ServletContexthandler创建一个(jetty)Server实例,并向其中添加了一个ServletHolder,并为其设置了ResourceConfig。这样的事情。
所以,我可以将我的东西从Spring注入到这个主类中,但是看不出我是如何将这些对象传递给JAX RS资源的?
我确信我会错过一些非常简单的事情。
编辑:我已经为我的问题和我在下面找到的解决方案添加了更好的解释。
答案 0 :(得分:4)
泽西岛有integration with Spring support。对于这种情况,您只需要做两件事:
确保您具有集成依赖性。你还需要公共登录,所以它不会抱怨
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring4</artifactId>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
只需添加ContextLoaderListener
以及包含Spring上下文配置的WebApplicationContext
。
ServletContextHandler context
= new ServletContextHandler(ServletContextHandler.SESSIONS);
AnnotationConfigWebApplicationContext wac
= new AnnotationConfigWebApplicationContext();
wac.register(SpringConfig.class);
context.addEventListener(new ContextLoaderListener(wac));
这里SpringConfig
只是一个“Java配置”Spring配置类。如果您希望可以使用XML应用程序上下文,但我在下面的链接中使用的示例使用Java配置类,但是如果您只想使用XML配置,还会显示如何轻松地将XML导入到类中。你可以把两个结合起来。
这就是它。配置完成后,您应该能够将您的Spring bean @Autowired
放入Jersey资源。
有关完整示例,请查看this GitHub repo
答案 1 :(得分:0)
也许我无法解释我的问题,所以基本上这是一个问题,当实际的JAX-RS应用程序没有通过自己的DI实例化时,如何将bean注入JAX-RS资源类机制,但来自其他地方。在我的情况下,我已经有了一个Spring容器来创建那些bean,并且没有简单的方法将Spring自己的bean应用程序上下文链接到JAX-RS的那个。一个更好的解决方案就是已经回答的问题,但另外一个问题是我们现有的Spring解决方案是基于XML的,而JAX-RS中的@Injected注释不能使用它(至少那个是什么?我已经阅读了他们的文档。
因此,JAX-RS支持@Injected注释,为了让它知道从哪里获取bean定义,我必须转到定义ResourceConfig的类并向其添加以下行:
.register(new AbstractBinder() {
@Override
protected void configure() {
bind(beanImpl1).to(BeanInterface1.class);
bind(beanImpl2).to(BeanInterface2.class);
}
})
实际的beanImpl1和beanImpl2 bean实例来自该类的构造函数,而后者又是通过XML配置从Spring实例化的。