2

Spring MVC を使用してアプリの作成を開始し、代わりに Tapestry を使用することにしました。元々使用していた XML を使用しない構成アプローチを維持したいと考えています。私は最初にこれを試しました:

public class ServletConfig implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // Spring //
        AnnotationConfigWebApplicationContext rootContext = new
        AnnotationConfigWebApplicationContext();
        rootContext.register(PersistenceContext.class, ApplicationContext.class);
        servletContext.addListener(new ContextLoaderListener(rootContext));

        // Tapestry //
        servletContext.setInitParameter("tapestry.app-package", "...");
        FilterRegistration.Dynamic filter = servletContext.addFilter("app", TapestrySpringFilter.class);
        filter.addMappingForUrlPatterns(null, false, "/*");
    }
}

ここでの問題は、空のコンストラクターを使用して、タペストリーが別の ContextLoaderListener を作成することです。WebApplicationContext を取り込む代わりに、contextClass および contextConfigLocation 初期パラメーターを調べます。だから私はこれを試しました:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    // Spring //
    servletContext.setInitParameter("contextClass",
            "org.springframework.web.context.support.AnnotationConfigWebApplicationContext");
    servletContext
            .setInitParameter(
                    "contextConfigLocation",
                    "...config.PersistenceContext ...config.ApplicationContext");

    // Tapestry //
    servletContext.setInitParameter("tapestry.app-package", "...");
    FilterRegistration.Dynamic filter = servletContext.addFilter("app", TapestrySpringFilter.class);
    filter.addMappingForUrlPatterns(null, false, "/*");
}

これが原因でした:

 java.lang.IllegalArgumentException: When using the Tapestry/Spring integration library, you must specifiy a context class that extends from org.apache.tapestry5.spring.TapestryApplicationContext. Class org.springframework.web.context.support.AnnotationConfigWebApplicationContext does not. Update the 'contextClass' servlet context init parameter.

TapestryApplicationContext は org.springframework.web.context.support.XmlWebApplicationContext を継承しています。私の質問: このアプローチで注釈ベースの構成を機能させる方法はありますか? そうでない場合、それを使用できるようにする別のアプローチはありますか? または、XML を回避する方法はありませんか?

ここに載せたServletConfigの最初のバージョンに戻そうとしましたが、追加しました

servletContext.setInitParameter("tapestry.use-external-spring-context", "true");

エラー メッセージは表示されなくなりましたが、ページも読み込まれません。/app/ をロードしようとすると、インデックス ページをロードする代わりに次のようになります。

<html>
    <head>
        <title>Error</title>
    </head>
    <body>/app/index.jsp</body>
</html>

何が原因なのかわかりません。ログに問題を示すものは何も見つかりません。ディスパッチャ サービスに何らかの問題があると考えています。このタイプのエラーを以前に見た人はいますか? これが私の元の問題と無関係なのか、それとも私のアプローチが有効でないことの兆候なのかはわかりません。これは別の問題だと誰かが私に言うことができれば、私は適切な行動を取ります.

4

1 に答える 1

1

すぐに使用できるSpring 統合では、XML ファイルが必要です。

SpringModuleDefを拡張し、オーバーライドしてAnnotationConfigApplicationContextlocateApplicationContextを返すことはそれほど難しくありません。

次に、新しい SpringModuleDef サブクラスをロードする独自のTapestrySpringFilter実装を作成します。

- 編集 - -

私が間違っていたのは、タペストリーの春の統合がWebApplicationContextUtils.getWebApplicationContext(servletContext)ApplicationContext を検索するために使用することです。したがって、TapestryStringFilter をロードする前に ApplicationContext を使用してサーブレット コンテキストを初期化することができ、それは機能するはずです。

例えば

ApplicationContext myContext = createAnnotationBasedAppContext();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, myContext);
于 2013-07-23T16:28:00.470 に答える