如何将bean注入JAX RS资源?

时间:2017-07-17 17:39:39

标签: jersey jax-rs javabeans inject

我确信这很可能是一个愚蠢的问题,但我不熟悉JAX RS(和泽西岛)。

我们有一个基本上启动RESTful服务的独立Java应用程序。作为重构的一部分,我们已将此应用程序移动到另一个应用程序中的一个线程。另一个应用程序使用在application-context.xml中定义的Spring bean。所以,我需要将一些bean注入资源类(如果它是正确的名称:带有@Path注释的那个,等等)。问题是我不知道实例化这个特定类是什么。遗留应用程序的一个主要类是使用ServletContexthandler创建一个(jetty)Server实例,并向其中添加了一个ServletHolder,并为其设置了ResourceConfig。这样的事情。

所以,我可以将我的东西从Spring注入到这个主类中,但是看不出我是如何将这些对象传递给JAX RS资源的?

我确信我会错过一些非常简单的事情。

编辑:我已经为我的问题和我在下面找到的解决方案添加了更好的解释。

2 个答案:

答案 0 :(得分:4)

泽西岛有integration with Spring support。对于这种情况,您只需要做两件事:

  1. 确保您具有集成依赖性。你还需要公共登录,所以它不会抱怨

    <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>
    
  2. 只需添加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导入到类中。你可以把两个结合起来。

  3. 这就是它。配置完成后,您应该能够将您的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实例化的。