1

long と String の 2 つのパラメーターを持つ Spring コントローラーがあります。

@RequestMapping(value = "/webpage")
@Controller
public class WebpageContentController {
//...
    @RequestMapping(value = "{webpageId}/{webpageAddress}", method = RequestMethod.GET)
    public String contentWebpageById(@PathVariable long webpageId, @PathVariable String webpageAddress) {
        System.out.println("webpageId=" + webpageId);
        System.out.println("webpageAddress=" + webpageAddress);
        //...
    }
//...

次のように呼び出すと:

http://localhost:8080/webarch/webpage/1/blahblah

すべて良好:

webpageId=1
webpageAddress=blahblah

しかし、スラッシュ付きの文字列パラメーターを渡すと (この場合は URL アドレス):

http://localhost:8080/webarch/webpage/1/https://en.wikipedia.org/wiki/Main_Page

エラーが発生します:

org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [/webarch/webpage/1/https://en.wikipedia.org/wiki/Main_Page] in DispatcherServlet with name 'appServlet'

そのようなパラメータをどのように渡しますか?

4

2 に答える 2

3

エラーは、Spring コントローラーのマッピングが原因で、Spring が次のような URL を参照したときに発生します。

http://localhost:8080/webarch/webpage/1/https://en.wikipedia.org/wiki/Main_Page

すべてのスラッシュはより深いコントローラー メソッドとして解釈されるため、「 https://en.wikipedia.org/wiki/Main_Page」をパラメーターとして「{webpageId}/{webpageAddress}」マッピングにマップする必要があることを「認識」していません。マッピング。(webpage/1/http:{anotherMapping}/wiki{anotherMapping}/Main_Page{anotherMapping})この種のマッピングは明らかに「{webpageId}/{webpageAddress}」では処理されないようなコントローラー メソッド マッピングを探します。

編集

あなたのコメントによると、このようなことを試すことができます

@RequestMapping(value = "/{webpageId}/**", method = RequestMethod.GET)
public String contentWebpageById(HttpServletRequest request) {

    String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);  

    String extractedPathParam = pathMatcher.extractPathWithinPattern(pattern, request.getServletPath());
    extractedPathParam = extractedPathParam.replace("http:/", "http://");
    extractedPathParam = extractedPathParam.replace("https:/", "https://");
    //do whatever you want with parsed string..
}

春の使用 4.2.1

SomeParsing では、正規表現を使用して URL の「変数」のみを抽出する必要があります。

于 2015-11-12T01:07:10.470 に答える
1

URL 内のすべての特殊文字をエンコードするだけです。

https://en.wikipedia.org/wiki/Main_Page

これになります:

https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FMain_Page

問題なく URL パラメータとして渡すことができます。デコードは自動的に行われるため、コントローラーで変数としてパラメーターにアクセスすると、既にデコードされた URL が含まれているため、変換する必要なく使用できます。

URL エンコーディングの詳細: https://en.wikipedia.org/wiki/Percent-encoding

于 2015-11-12T06:28:07.673 に答える