1

Spring アプリケーションがあり、Grails アプリケーションをデプロイする組み込みの Jetty インスタンスをその中で実行したいと考えています。

Spring アプリケーションのアプリケーション コンテキストにアクセスするには、Grails アプリケーションが必要です。

次のように 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;
}
}

さらに、元の ContextLoaderListener を Grails アプリケーションの web.xml から削除しました。このアプローチは、別の非 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)

この問題をどのように解決できますか?助けてくれてありがとう

4

1 に答える 1

0

私は最終的に、まったく異なるアプローチを使用しました。たとえば、ContextSingletonBeanFactoryLocator を使用するソリューションについては、このリンクhttp://techo-ecco.com/blog/spring-application-context-hierarchy-and-contextsingletonbeanfactorylocator/を参照してください。

于 2012-11-07T12:10:31.093 に答える