3

私はSpringMVCショーケースの例を研究しており、リクエストマッピングトピックについて簡単な説明をお願いします。

実際には、私の見解では、次の2つのリンクがあります。

        <li>
            <a id="byParameter" class="textLink" href="<c:url value="/mapping/parameter?foo=bar" />">By path, method, and presence of parameter</a>
        </li>

        <!-- PERSONALE -->
        <li>
            <a id="byParameter2" class="textLink" href="<c:url value="/mapping/parameter?foo2=blabla" />">(PERSONALE) By path, method, and presence of parameter with value="blabla"</a>
        </li>

「/mapping/ parameter /」フォルダに向けてHTTPリクエストを生成しますが、パラメータが異なります

最初のパラメーターにはfooという名前のパラメーターがあり、2番目のパラメーターにはfoo2という名前のパラメーターがあります。

わかりました...今私はそうします:最初のリンク(「foo」という名前のパラメータを持つもの)によって生成されるHTTPリクエストはメソッドによって処理され、2番目のリンク(「foo2」という名前のパラメータを持つもの)によって生成されるHTTPリクエスト)他の方法で処理されます

したがって、私のコントローラークラスでは、次の2つのメソッドを追加してこのようにすることを考えました。

@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params="foo")
public @ResponseBody String byParameter() {
    return "Mapped by path + method + presence of query parameter!";
}

@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params="foo2")
public @ResponseBody String byParameter(@RequestParam("foo2") String foo2) {
    return "Mapped by path + method + presence of query parameter! (MappingController). Parameter value = " + foo2;
    }

(コードの2番目のピックアップもパラメーター値ですが、これは重要ではないと思います)

問題は、2番目のリンクをクリックするとエラーが発生し、スタックトレースに次のエラーメッセージが表示されることです。

2012年11月24日19:56:42org.apache.catalina.core.StandardWrapperValveがSEVEREを呼び出します:パス[/ spring-mvc-showcase]のコンテキストでサーブレット[appServlet]のServlet.service()が例外をスローしました[リクエスト処理に失敗しました; ネストされた例外はjava.lang.IllegalStateExceptionです:HTTPパスにマップされたあいまいなハンドラーメソッド'http:// localhost:8080 / spring-mvc-showcase / mapping / parameter':{public java.lang.String org.springframework.samples.mvc .mapping.MappingController.byParameter(java.lang.String)、public java.lang.String org.springframework.samples.mvc.mapping.MappingController.byParameterNegation()}]ルート原因java.lang.IllegalStateException:マップされたあいまいなハンドラーメソッドHTTPパスの場合'http:// localhost:8080 / spring-mvc-showcase / mapping / parameter':{publicjava.lang.Stringorg.springframework.samples.mvc.mapping.MappingController。

アプリケーションはパス「/mapping/ parameter」にどのメソッドを使用するかを理解できないようですが、なぜですか?

最初のメソッドには、「/ mapping / parameter」フォルダーへのHTTPリクエストを処理する必要があることを明示的に指定する@RequestMappingアノテーションが付けられ、fooという名前のパラメーターがあります。2番目のメソッドは、HTTPリクエストを処理する必要があることを示す@RequestMappingのアノテーションです。 「/mapping/parameter」フォルダとfoo2という名前のパラメータがあります...あいまいな状況ではないと思います

問題は、2つのメソッドが異なる署名を持っているために同じ名前であり、2つの異なるメソッドであるということではないと思います...(2番目のメソッドの名前も変更しようとしましたが、問題は残ります)

また、奇妙な考えは、最初のリンク(「foo」という名前のパラメーターでHTTPリクエストを生成するリンク)をクリックすると、最初のメソッドによって正しく処理されるということです...なぜこれはあいまいではないのですか?!?!

どうすれば解決できますか?

どうもありがとうございます

アンドレア

4

3 に答える 3

4

あなたのコードは正しいです!問題はコード内のどこかにあるはずです。簡単なプロジェクトを作成してスニペットをコピーしましたが、問題なく動作しました。

ここから私のサンプルをダウンロードできます(これはEclipse Mavenプロジェクトです)。

あなたの問題は、3番目の方法または2番目のコントローラーを見落としている可能性があることだと思います。

于 2012-11-25T11:14:19.577 に答える
0

「params」の使用に関するAPIを確認してください。

サーブレット環境では、パラメータマッピングは、タイプレベルで適用される制限と見なされます。プライマリパスマッピング(つまり、指定されたURI値)は、ターゲットハンドラーを一意に識別する必要があります。パラメーターマッピングは、ハンドラーを呼び出すための前提条件を表すだけです。

于 2012-11-29T09:37:35.037 に答える
0

これはstackoverflow.com/questions/8954426の複製のように見えます。

あなたのケースの解決策:

@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params={"foo", "!foo2"})
@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params={"foo2", "!foo"})

説明については私の完全な答えを参照してください。

于 2014-06-06T15:04:57.983 に答える