首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在解决应用程序上下文之前启动tomcat

如何在解决应用程序上下文之前启动tomcat
EN

Stack Overflow用户
提问于 2015-12-11 16:09:45
回答 1查看 1K关注 0票数 1

我们有一个现有的web应用程序,它在spring上下文初始化期间计算ServletContext.contextPath

我做了一些修改,所以这个应用程序现在使用了spring引导,在普通的tomcat中,它按照设计的方式工作。

如果我从命令行启动应用程序,那么计算ServletContext的bean将在现在有servlet上下文可用的时候处理。即使没有onStartup(ServletContext)事件,bean也“准备好”了。

这就是发生的事情:

  1. 实现FactoryBean,ServletContextAware
  2. bean由spring创建,并由另一个bean y (getObject)使用。
  3. getObject返回null,因为没有调用setServletContext。

我试图将(Web)应用程序上下文插入到x中,这是可行的。但是在使用bean时,webapplication上下文中的servlet上下文还没有被设置.

出于调试的原因,我提供了一个虚拟servlet上下文来查看接下来会发生什么。原来,整个tomcat只有在bean x和bean y“准备好”并启动之后才会启动。

一开始我有

代码语言:javascript
运行
复制
- Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@3972a855: startup date [Fri Dec 11 16:56:33 CET 2015]; root of context hierarchy

有些时候,我在日志文件中看到以下条目:

代码语言:javascript
运行
复制
 Tomcat initialized with port(s): 8080 (http)
Dez 11, 2015 4:56:42 PM org.apache.catalina.core.StandardService startInternal
INFORMATION: Starting service Tomcat
Dez 11, 2015 4:56:42 PM org.apache.catalina.core.StandardEngine startInternal
INFORMATION: Starting Servlet Engine: Apache Tomcat/8.0.28
Dez 11, 2015 4:56:42 PM org.apache.catalina.core.ApplicationContext log
INFORMATION: Initializing Spring embedded WebApplicationContext

那么,如何声明我的bean只有在整个web环境启动之后才能准备好呢?ServletContextAwareWebApplicationInitializer都做不到这一点。

因此,到目前为止,我可以使用带有外部tomcat的spring引导,但不能作为可执行的jar,因为在满足所有要求之前,我的been被标记为“就绪”。

这就是我看到的堆栈痕迹:

代码语言:javascript
运行
复制
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:154)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:677)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:519)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
    at org.springframework.boot.SpringApplication.doRun(SpringApplication.java:347)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:295)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1112)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1101)
    at com.db.opra.boot.Starter.main(Starter.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.NullPointerException
    at myClass.servletContext.getContextPath(WebContextNameResolverFactory.java:69)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
EN

回答 1

Stack Overflow用户

发布于 2015-12-11 18:05:28

你可以让你的豆听ContextRefreshed 事件。很简单,您需要添加带有@EventListener注释的方法,该方法以ContextRefreshedEvent作为参数:

代码语言:javascript
运行
复制
 @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event) {
        ...
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34227820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档