0

まず、私が持っているセットアップを説明しましょう。

私のWebアプリケーションは、モジュール1がモジュール2のコントローラー/サービスを使用して共通の機能を再作成し、コードの冗長性を取り除く方法で相互にリンクされた複数のモジュールで構成されています。簡単に言えば、1 つのアプリケーションのすべてのクラスが jar として別のアプリケーションに含まれている 2 つの別個の Web アプリケーションです。

現在、私が直面している問題は、次のシナリオに従って、サブモジュールの一般的な URL マッピングが原因です。

モジュール 1 のコントローラ A がモジュール 2 のコントローラ B を拡張

package com.module1;

@RequestMapping("/client")
public class A extends B {

    @RequestMapping("/hello")
    public void helloWorldNew(...) {
        ...
    }
}



package com.module2;

@RequestMapping("/user")
public class B {

    @RequestMapping("/")
    public void helloWorld(...) {
        ...
    }
}

モジュール 1 のコントローラー C がモジュール 2 のコントローラー D を拡張

package com.module1;

@RequestMapping("/client")
public class C extends D {

    @RequestMapping("/helloworld")
    public void helloWorldNew(...) {
        ...
    }
}



package com.module2;

@RequestMapping("/human")
public class D {

    @RequestMapping("/")
    public void helloWorld(...) {
        ...
    }
}

ご覧のとおり、モジュール 2 を個別に取り上げると、マッピングされた URL は/user/&/client/であり、これはあらゆる意味で合法です。モジュール 1 が登場すると、予想どおり、Spring は URL/client/がすでにマッピングされてA.helloWorld()いることを示す例外をスローしますC.helloWorld()

これを回避する方法はありますか?スーパークラスにあるメソッドレベルの RequestMappings を単純に無視するように Spring に依頼できますか? または、Spring をハックしてマッピングを無視/オーバーライドする方法はありますか (ルートレベルの RequestMappings のように)?

どんな助けでも大歓迎です。

ありがとう、
サミット

4

1 に答える 1

2

これを行うには、いくつかの方法が考えられます。

モジュール 1 をセットアップするときに、モジュール 1 で関連するパッケージのみに対してコンポーネント スキャンを実行できます (これは、モジュール 1 とモジュール 2 でパッケージ名が異なることを前提としています。

<context:component-scan base-package="package1, package2" use-default-filters="false">
</context:component-scan>

パッケージ名があまり変わらない場合は、クラス名パターンで除外してみてください。

<context:exclude-filter type="regex" expression="*.Module1Class"/>

2 番目のアプローチは、モジュール 2 抽象で基本クラスを宣言することです。この方法では、基本クラスに対応するコントローラーはまったく作成されません。

基本クラスがそれほど重要でない場合の 3 番目のアプローチは、モジュール 1 に指定されている RequestMappings とまったく衝突しない @RequestMapping を配置することです。

于 2012-05-15T21:12:27.980 に答える