4

ControllerClassNameHandlerMapping を使用して Controller と次のようなメソッドをマップする既存のアプリケーションが Sping 3.0 にあります。

StartController.class is mapped to http://127.0.0.1/app/start/*

それから

StartController.class has a method called init() that is mapped to http://127.0.0.1/app/start/init.html

これが私の構成です:

@Bean
public ControllerClassNameHandlerMapping classNameControllerMappings() {
     return new ControllerClassNameHandlerMapping() {{
        setCaseSensitive(true);
        setDefaultHandler(new UrlFilenameViewController());
        setInterceptors(new Object[]
                {callProgressionInterceptorHandler(),
                 callSessionInterceptorHandler(),
                 localeChangeInterceptor()});
     }};
}

ほとんどのコントローラーには、各コントローラーに 5 ~ 15 個の Request Mapped メソッドがあります。

しかし、Spring 3.1+ にアップグレードすると、各コントローラーのリクエスト マッピングがあいまいになり、正しくマッピングされません。

解決策の 1 つは、メソッド名を明示的に追加することです。

@RequestMapping(method = RequestMethod.GET)

次のようになります。

@RequestMapping(method = RequestMethod.GET, value = "init")

必要がない場合は、 @RequestMapping 値を 100 以上のメソッドに手動で追加したくありません。

誰でもより良い解決策を手伝ってもらえますか?

これが私が得続けるエラーです:

        47672 [btpool0-1] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'addressConfirmationController' bean method
    public void com.comcast.ivr.d2.web.controllers.AddressConfirmationController.houseNumber_rc(org.springframework.ui.ModelMap)
    to {[],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'addressConfirmationController' bean method

setOrder(1); も追加しました。ControllerClassNameHandlerMapping に追加しても、このエラーが発生します。

更新: http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.htmlで次の抜粋を見ました:

Spring 3.1 より前では、タイプ レベルとメソッド レベルのリクエスト マッピングは 2 つの別々の段階で検査されていました。最初に DefaultAnnotationHandlerMapping によってコントローラーが選択され、2 番目に呼び出す実際のメソッドが AnnotationMethodHandlerAdapter によって絞り込まれました。

Spring 3.1 の新しいサポート クラスでは、RequestMappingHandlerMapping は、どのメソッドがリクエストを処理するかを決定する唯一の場所です。コントローラーメソッドは、タイプおよびメソッドレベルの @RequestMapping 情報から派生した各メソッドのマッピングを持つ一意のエンドポイントのコレクションと考えてください。

これは、 <3.1 のように @RequestMapping にマッピングの詳細を追加しないと、同じ @RequestMapping を保持できないということですか?

これを実現するには、何百ものメソッドを変更する必要があります... :-(

4

0 に答える 0