背景:我构建了一个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");
}
}
}
所以现在我卡住了:有没有办法使用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。 我目前不