当前位置: 首页 > 知识库问答 >
问题:

如何用Spring初始化Jersey应用程序(ResourceConfig)?

严峰
2023-03-14

背景:我构建了一个Jersey应用程序(即一个WAR),并在服务器集群上部署它,在不同的服务器上配置不同的Spring配置,以启用或禁用服务器的不同部分,例如,某些服务器启用了/search资源,等等。这在Jersey 1.0中非常容易:我只是说,

<context:component-scan base-package="com.mycompany.resources.search"/>

在Spring配置中,让Jersey扫描特定包并启用其中的JAX-RS资源提供者。

现在在Jersey 2.0中,Spring 不起作用,因此必须以编程方式在从ResourceConfig派生的启动类中注册资源:

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        packages("com.mycompany.resources.search");
    }
}

到目前为止还不错,但我需要有条件地扫描该包,并且我不知道如何将任何Spring配置添加到MyApplication类中。我认为构造函数注入可能会起作用:

public class MyApplication extends ResourceConfig {

    @Autowired
    public MyApplication(@Qualifier("my-config") MyConfiguration myConfiguration) {
        if (myConfiguration.isEnabled()) {
            packages("com.mycompany.resources.search");
        }
    }
}

然而HK2抱怨它找不到一个默认的构造函数来使用...所以这表明DI在这个类的构造中起作用,但是DI没有使用Spring。

类似地,使用Spring bean生命周期也不起作用:

public class MyApplication extends ResourceConfig implements InitializingBean {

    @Autowired
    private MyConfiguration myConfiguration;

    public MyApplication() {
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        if (myConfiguration.isEnabled()) {
            packages("com.mycompany.resources.search");
        }
    }
}

(未调用afterpropertiesset方法。)

所以现在我陷入了困境:有没有办法使用Spring配置一个JerseyResourceConfig应用程序对象?

更新:

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        ApplicationContext rootCtx = ContextLoader.getCurrentWebApplicationContext();
        MyConfiguration myConfiguration = rootCtx.getBean(MyConfiguration.class);

        if (myConfiguration.isEnabled()) {
            packages("com.mycompany.resources.whatever");
        }
    }
}

共有1个答案

轩辕佑运
2023-03-14

所以现在我卡住了:有没有办法使用Spring配置一个Jersey ResourceConfig应用程序对象?

我不认为您可以将Jersey配置为从Spring获取您的ResourceConfig作为Spring托管bean。这有点怪,但你可以这样做。注意,您将得到ResourceConfig的两个实例:一个由Spring管理,另一个由Jersey管理:

public class MyApplication extends ResourceConfig {

    // static, available to all instances
    private static MyConfiguration myConfiguration;

    public MyApplication() {
        // when Spring creates the first instance of MyApplication, myConfiguration
        // will be null because the setter wasn't called yet
        if (myConfiguration != null)
        {
            // second instance created by jersey... Spring will have autowired
            // the first instance, and myConfiguration is static
            if (myConfiguration.isEnabled()) 
                packages("com.mycompany.resources.search");
        }
    }

    @Autowired
    public void setMyConfiguration(MyConfiguration config)
    {
        // instance level setter saves to a static variable to make it available for
        // future instances (i.e. the one created by jersey)
        MyApplication.myConfiguration = config;
    }
}

再一次,这是相当骇人听闻的。您需要确保Spring是在Jersey之前初始化的,并仔细观察初始化期间可能出现的线程问题。

 类似资料:
  • 我正在将Spring Boot应用程序从版本1.5.6升级到2.1.1。当我启动应用程序时,它会卡在这一行: 当我点击这个网址:http://localhost:8888/actuator/health,我得到 同样,当我点击这个网址:http://localhost:8888/swagger-ui.html,我看到斯瓦格用户界面。 但是我的主应用程序没有启动。知道为什么它卡住了吗?

  • 当我使用MYSQL数据库运行我的项目时,它工作正常,但当我尝试使用Oracle数据库运行它时,我收到了以下异常。 org.springframework.beans.factory.BeanCreationException: 创建名为“embeddedServletContainerCustomizerBeanPostProcessor”的 bean 时出错:Bean 初始化失败; 编辑1个异常

  • 我有一个Spring web应用程序。当应用程序上下文启动时,我使用执行一些应用程序initalization,特别是从web服务加载数据。如果这个web服务不能到达,那么我的应用程序就不能做任何有用的事情,保持它运行也没有意义。是否有方法以编程方式关闭应用程序上下文? 我已经试着做了以下几点: 那么在这种情况下关闭应用程序的正确方法是什么呢?

  • 你已经有了基本的页面布局和需要用的CSS以及JS文件。现在我们需要初始化我们的应用,比如在 my-app.js中 var myApp = new Framework7(); 上面这个例子中我们使用了 myApp 作为变量名存储 Framework7 初始化之后的实例。 这样初始化非常简单,但是Framework7 也提供了更多个性化的定制,只需要在初始化的时候传入一个配置对象即可。 var myA

  • 我想不出如何使爆米花工作,如下所示:https://getbootstrap.com/docs/4.0/components/popovers/. 文档中提到了popover支持是一个插件,并且需要工具提示插件,所以我修改了我的要添加这两个,现在看起来如下所示: 我还没有找到任何关于引导插件概念的文档,所以上面关于和的两行来自搜索,不确定它们是否正确。 留档声明: Popovers是基于性能原因选

  • 我有以下情况。在我的微服务[MA]中,我希望在应用程序启动后或基于某个事件初始化/销毁一些bean。想象一下,还有另一个微服务[MB],它保存关于ContentStores的信息。在MA启动之后,我想向MB请求contentStore条目,基于此,我想根据需要创建这么多bean。可能会有一个事件触发storrecreated/storredeleted,在这种情况下,我需要销毁bean。 我目前不