0

解決するのに3時間以上かかった、いくつかの本当に厄介な問題を見つけました。なぜそうなのか、誰かが説明してくれるかどうか疑問に思っていました。どちらもまったく同じ文脈に属していると思うので、2 つの質問があります。私にとってこれは sf の威圧的で興味深い行動の両方であるため、読者が忍耐を持ってくれることを願っています。

エラーと解決策しかわかりませんが、理解するまで満足できません:

  1. 私が従うガイダンス: 1つの構成ファイルを用意します-ルートcustomConfig内でのみパッケージスキャンを使用し(web.xmlでマッピングを介して宣言されます)、servlet-context.xmlがコントローラーのパッケージのみをスキャンするようにします。他のすべてのコンテキスト ファイルは、 customConfigの最初にある import ディレクティブを介してインポートされます。

1.1他の方法で実行するとエラーが発生する: (さまざまなコンポーネントの) 依存関係の挿入は、複数の重複する構成パッケージのスキャンで劇的に失敗します。

1.2他の方法で実行した場合のエラー: servlet-context.xmlが同じパッケージをスキャンすると、 entityManagerFactoryとのコンテキストで transactionManager のサービス リクエスト中のトランザクションが失敗します。(つまり、 customConfigスキャンと同じサービス パッケージ)

2: LocaleChangeInterceptorはservlet-contextでのみ宣言できます- カスタム ルート構成では機能しません。理由は不明です ( customConfig内にコントローラー パッケージのパッケージ スキャンを追加しても機能しませんが、今はちょっとおかしいです -一方、SessionLocaleResolverは機能します)カスタム設定で定義されていればOK!)

Q1: では、重複するコンテキスト コンポーネント パッケージ スキャンを誤って追加した人間の責任は私にありますか? それとも、Spring がこれらの衝突を解決するのは論理的でしょうか? または、解決する必要がありますが、何らかの理由で機能しませんか?

私は仲間の開発者を観察し、Spring の構成に触れたり、改善したり、更新したりしないことが最善であると彼が言ったとき、微笑みました。私は微笑みましたが、今は明らかにそうではありません (私は今、この sf 構成の暴力に親しみを感じています)。このすべての後、servlet-context.xml のような単一の構成ファイル内にすべてを配置しても問題ないと思いますか?

Q2: LocaleChangeInterceptorの背後にある魔法は何ですか。「試行錯誤」の気分でservlet-contextに移動し、機能するまで、約 5 時間かけて修正しました。

2 つ目は、解決すべき純粋な謎です。customConfig内には特別なものはありません

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<!-- 
<import resource="securityContext.xml"/>  -->
<import resource="jpaContext.xml"/> 


<context:annotation-config /> 
<context:component-scan base-package="com.org.app" />


<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/messages" />
    <property name="defaultEncoding" value="UTF-8"/>
</bean>


<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en_GB" />
</bean>

     <mvc:interceptors>
        <bean
            class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
            p:paramName="lang" />
    </mvc:interceptors> ...

?lang=locale_LOCALE リクエストを発行した後、何も起こりません。エラーも表示もありません。アプリは正常に読み込まれ、ページは同じロケールで再読み込みされます。

ただし、このインターセプター コードを以下の servlet-context.xml内に配置すると、ロケール リクエストで正常に解決されます。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing 
        infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <context:component-scan base-package="com.org.app.controller" />


    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
        up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
        in the /WEB-INF/views directory -->
    <beans:bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>


<interceptors>
        <beans:bean
            class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
            p:paramName="lang" />
    </interceptors>


</beans:beans>
4

1 に答える 1

1

LocalChangeInterceptorとは で定義LocaleResolverする必要がありますservlet-context.xml<context:annotation-driven />の使用によってすでに暗示されています<context:component-scan />

@Controllerルートコンテキストでは、それらを除外する必要があるかどうかもスキャンしています。

<context:component-scan base-package="com.org.app">
    <context:exclude-filter type="annotation" value="org.springframework.stereotype.Controller" />
</context:compoment-scan>

基本的に、すべての Web 関連のもの (および によって使用されるものDispatcherServlet) は、 によってロードされる必要がありますDispatcherServlet。その性質上、親ではなく、必要な Bean の独自のローカル アプリケーション コンテキストのみを調べます。

これは、それぞれ独自の構成を持つ複数の DispatcherServlet を持つことができるためです。これは、ルート アプリケーション コンテキストから構成をロードすると壊れてしまいます。

于 2013-09-07T08:11:29.813 に答える