我们有一个自定义的异步ContextLoader,因此临时解决方案需要在Jersey-Spring3源中放置一个完全hack,以在自定义组件提供程序初始化之前等待应用程序初始化。
PS对于任何发现自己必须执行此类操作的可怜人,请确保meta-INF / settings包含SpringComponentProvider配置。
请注意,这是一个可怕的骇客,只有在所有其他尝试都失败的情况下,我才尝试尝试最后的手段,例如我的情况。另外,在尝试此类操作之前,我会咨询泽西岛邮寄小组有关你的问题的信息。
就是说…这就是我为解决我的问题所做的:
从字面上将spring-jersey3的源代码复制到我的应用程序/服务器中,并根据许可证使用适当的标签修改每个文件的标题;
创建了以下类
===>
public class ContextLoadWaiter { private static final Logger logger = Logger.getLogger(ContextLoadWaiter.class); public void doWait() { try { while (ContextLoaderHttpInterceptor.isNotStarted()) { logger.info("Waiting for ContextLoader to start..."); Thread.sleep(1000); } } catch (InterruptedException e) { logger.error("SpringComponentProvider was interrupted!"); } } }请注意,这特定于 our 代码库,就像
ContextLoaderHttpInterceptorhttp servlet一样,如果尚未加载我们的自定义(恰好是异步的),则
isNotStarted返回。
trueContextLoader
ContextLoader出于某种原因,有人在某个时候将自定义异步程序放置在适当的位置,以使服务器启动时允许UI显示“正在加载”页面。(可能不是添加此UI“功能”的正确方法,但是代码在那里并且UI依赖于它,所以我不得不处理它…)
由于这部分内容并不直接适用于你,因此关键是要调试
SpringComponentProvider(从此处开始)并查看的值
ClassPathXmlApplicationContext。如果它是null,就像我们的情况一样,那么你需要找出原因,null并ContextLoader在初始化此组件之前等待用于加载的任何内容。
- 将这条黑线放在SpringComponentProvider
==>
... private final ContextLoadWaiter waiter = new ContextLoadWaiter(); ... @Override public void initialize(ServiceLocator locator) { waiter.doWait(); // Wait on our asynchronous context loader. this.locator = locator; if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Context lookup started"); } ...创建了这个文件:
meta-INF/services/org.glassfish.jersey.server.spi.ComponentProvider
其内容是SpringComponentProvider的完全限定的类路径,例如com.company.server.nbi.rest.internal.jspring.SpringComponentProvider
添加了定制的Jersey-spring3软件包作为要在应用程序中进行扫描的软件包;见下文…
==>
public class MyJerseyApplication extends ResourceConfig { private static final class Messages { static final String INF_STARTING_APPLICATION = "Starting %s!"; } private static final Logger logger = Logger.getLogger(MyJerseyApplication.class); public MyJerseyApplication() { packages( "com.company.server.nbi.rest.providers", "com.company.server.nbi.rest.filters", "com.company.server.nbi.rest.internal.jspring", // HERE!!! "com.fasterxml.jackson.jaxrs.json", "com.fasterxml.jackson.jaxrs.base"); register(ResourceA.class); register(ResourceB.class); register(ResourceC.class); register(MultiPartFeature.class); register(LoggingFilter.class); logger.info(format(Messages.INF_STARTING_APPLICATION, this.getClass().getName())); }}而已”。绝对不是值得骄傲的解决方案,但是如果你像我一样处于绝望状态,试一下可能不会有任何伤害。



