2017-07-17 70 views
1

我相信这很可能是一个愚蠢的问题,但我不熟悉JAX RS(和泽西岛)。如何将bean注入JAX RS资源?

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

所以,我可以从Spring注入我的东西到这个主类,但看不到我能够将这些对象传递给JAX RS资源的确切时间?

我相信我错过了很简单的事情。

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

+0

另请参见:https://stackoverflow.com/questions/31099409/how-to-inject-applicationcontext-in-jax-rs –

回答

3

泽西岛有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. 只是包含您的Spring上下文配置的WebApplicationContext旁边加上ContextLoaderListener

    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 beans的@Autowired加入到你的Jersey资源中。

对于一个完整的例子,看看this GitHub repo

+0

谢谢,这似乎是一个不错的解决方案!我设法以另一种(更简单)的方式解决了我的问题(这很可能是因为我在开始时没有正确解释我的问题)。我会在下面发布我的解决方案。 – Evgeni

0

也许我不能很好地解释我的问题,所以基本上它是如何注入豆成JAX-RS资源类问题时的实际JAX- RS应用程序没有通过自己的DI机制实例化,而是从其他地方实例化。就我而言,我已经有了一个创建这些bean的Spring容器,并且没有简单的方法将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实例化的。

相关问题