我有一个 Spring 应用程序,我想在其中运行一个嵌入式 Jetty 实例,我想在其中部署一个 Grails 应用程序。
我需要 Grails 应用程序才能访问 Spring 应用程序的应用程序上下文。
我正在部署 Grails 应用程序,如下所示:
Server webServer = new Server(8080);
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar("MyGrailsApp.war");
webServer.setHandler(webapp);
webServer.start();
为了让 Grails 应用程序访问 Spring 应用程序上下文,我在调用webServer.start()之前进一步添加了这些行:
ParentAwareContextLoaderListener contextLoaderListener = new ParentAwareContextLoaderListener();
//appContext is context of my Spring application
contextLoaderListener.setApplicationContext(appContext);
webapp.addEventListener(contextLoaderListener);
ParentAwareContextLoaderListener 是一个像这样的简单类:
public class ParentAwareContextLoaderListener extends ContextLoaderListener implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
protected ApplicationContext loadParentContext(final ServletContext servletContext) {
return applicationContext;
}
@Override
public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
我进一步从 Grails 应用程序 web.xml 中删除了原始的 ContextLoaderListener。虽然这种方法适用于另一个非 Grails 应用程序,但由于某种原因它不能与 Grails 一起使用。我得到这个例外:
20138 [main] ERROR org.springframework.web.context.ContextLoader ContextLoader - Context initialization failed
java.lang.IllegalArgumentException: ConfigurableWebApplicationContext environment must be of type ConfigurableWebEnvironmentObject of class [org.springframework.core.env.StandardEnvironment] must be an instance of interface org.springframework.web.context.ConfigurableWebEnvironment
at org.springframework.util.Assert.isInstanceOf(Assert.java:337)
at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.getEnvironment(AbstractRefreshableWebApplicationContext.java:147)
at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.getEnvironment(AbstractRefreshableWebApplicationContext.java:1)
at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.resolvePath(AbstractRefreshableConfigApplicationContext.java:122)
at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.setConfigLocations(AbstractRefreshableConfigApplicationContext.java:81)
at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.setConfigLocation(AbstractRefreshableConfigApplicationContext.java:69)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:380)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
知道如何解决这个问题吗?感谢您的任何帮助