2013-12-11 12 views
16

私はコントローラーのメソッドを見つけました。このIDは何ですか:+ + ??Spring MVCリクエストマッピングハンドラメソッドの{id:。+}の意味は何ですか?

@RequestMapping(value="/index/{endpoint}/{type}/{id:.+}", method=RequestMethod.POST, consumes=kContentType, produces=kProducesType) 
@ResponseBody 
public String indexData(@PathVariable(value="endpoint") String endpoint, @PathVariable(value="type") String type, @PathVariable(value="id") String id, @RequestBody String body, HttpServletRequest request) { 
    logger.debug("In web controller for endpoint " + endpoint); 
    return indexController.indexData(endpoint, type, id, body, getSecurityContextProvider(request)); 
} 

答えて

18

スプリングMVCコントローラのrequestmappingのパス変数の構文は{variable_name:regular_expression}です。オプションで正規表現を省略すると、より頻繁に表示されるものにつながります。{id}

したがって、例の/index/{endpoint}/{type}/{id:.+}では、変数名はidであり、正規表現は.+です(下記のスプリングドキュメントを参照してください)。

正規表現.+は、「メタキャラクタ.に1回以上一致しています」と記載しています。 '。'メタキャラクタは、空白を含む任意の文字を表します(ただし、一部の実装では改行にマッチしません)。 http://en.wikipedia.org/wiki/Regular_expression

複雑な変数名を持つことができるため、あるいは変数の値に吸い込まれるパスの最後に他の重要な情報が存在する可能性があるため、Springは変数の値を決定するのに役立ちますもしSpringが "パスの終わりまで行く"と言ったら(例えばファイル名の拡張子やパス変数)。

あなたの例では、id変数に特殊文字が含まれている可能性があります。そうしないと、変数が途中で終了する可能性があります。ファイル拡張子(foobar.jpg)を含むファイル名を使用しようとする前にこの問題に遭遇しました。 Springは変数の "foobar"部分だけを返します。なぜならSpringは、ピリオドデリミタで変数値を終了させたいと仮定していたからです。したがって、この場合、 "id"が完全な値と一致することを確認するために、Springに先行して最後のスラッシュとパスの終わりの間のすべてを一致させる正規表現を置きます。 SO参考:Spring MVC @PathVariable getting truncated

は、ここで複素変数のマッチングを扱う春のドキュメントからの抜粋です:

時々、あなたはURIテンプレート変数を定義する際に、より精度を必要としています。 URL "/spring-web/spring-web-3.0.5.jar"を考えてみましょう。どのように複数の部分に分解しますか?

@RequestMappingアノテーションは、URIテンプレート変数での正規表現の使用をサポートしています。構文{VARNAME:正規表現}である。 - :

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}") 
public void handle(@PathVariable String version, @PathVariable String extension) { 
    // ... 
} 

出典:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html最初の部分は、変数名と第二の定義ここで正規表現を」

は、それらの(かなり複雑な)例であります

彼らはあなたが正規表現を使用せずにすることができない方法を偶然にをコントローラに要求から複雑なマッピングを実行する方法を示しを提供例。

+0

あなたが提供することができこのサービスにアクセスするために使用できるURLの例 –

+0

"/index/foo/bar/foo.bar"が動作します。 idパス変数に "。+"正規表現がなければ、 "foo.bar"ではなくidに "foo"しか得られません – reblace

+0

私はあなたに従うことを確信していません –

関連する問題