2011-02-04 8 views
140

Spring 3.0では、オプションのパス変数を使用できますか?例えば、ここでSpring 3.0では、オプションのパス変数を作成できますか?

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET) 
public @ResponseBody TestBean testAjax(
     HttpServletRequest req, 
     @PathVariable String type, 
     @RequestParam("track") String track) { 
    return new TestBean(); 
} 

については

私は同じメソッドを呼び出すために/json/abcまたは/jsonをしたいと思います。

@RequestMapping(value = "/json", method = RequestMethod.GET) 
public @ResponseBody TestBean testAjax(
     HttpServletRequest req, 
     @RequestParam(value = "type", required = false) String type, 
     @RequestParam("track") String track) { 
    return new TestBean(); 
} 

、その後/json?type=abc&track=aaまたは/json?track=rrあなたは、オプションのパス変数を持つことができません

答えて

147

に動作しますが、あなたは同じことを呼び出す2つのコントローラメソッドを持つことができます。
1つの明白な問題を回避するには、リクエストパラメータとしてtypeを宣言するサービスコード:

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET) 
public @ResponseBody TestBean typedTestBean(
     HttpServletRequest req, 
     @PathVariable String type, 
     @RequestParam("track") String track) { 
    return getTestBean(type); 
} 

@RequestMapping(value = "/json", method = RequestMethod.GET) 
public @ResponseBody TestBean testBean(
     HttpServletRequest req, 
     @RequestParam("track") String track) { 
    return getTestBean(); 
} 
+0

これは確かにそれを行うための良い方法です。 – Shamik

+3

@Shamik:これは、私の意見では、パス変数を使用する魅力的な理由ではありません。コンビナトリアルの増殖はすぐに手を抜くことができます。 – skaffman

+7

実際には、オプションのコンポーネントでいっぱいになっている間にそのパスを複雑にすることはできないからです。 2つ以上のオプションのパス要素が2つ以上ある場合は、そのうちのいくつかをパラメータの要求に切り替えることを真剣に検討する必要があります。 –

20

あなたは使用することができます

@RequestParam(value="somvalue",required=false) 
オプションのparamsのため

ではなくpathVariable

+1

これはバージョン固有のようです。 –

+4

現在、このメソッドをSpring 3.1プロジェクトに使用しており、ドキュメントでは2.5+で動作すると言われているので、Spring 3では間違いなく動作します。[source](http://static.springsource。 org/spring/docs/3.0.x/api/org/springframework/web/bind/annotation/RequestParam.html)。 –

+18

真実ですが、これは質問に関するものではありません。 * request *パラメータを使用することは実際に* "一つの明白な回避策" *として質問に記載されていますが、質問自体は* path *パラメータに関するものです。これはオプションのパスパラメータの解決策ではありません。 – Arjan

2

このSpring 3 WebMVC - Optional Path Variablesをチェックしてください。 AntPathMatcherを拡張して、オプションのパス変数を有効にし、助けになるかもしれない記事を示しています。記事を投稿するためのすべてのクレジットはSebastian Heroldになります。

69

@PathVariableアノテーションを使用してパス変数のマップを挿入できることはよく知られていません。私は、それが後から追加された場合、この機能は春3.0で使用可能な場合はわからないんだけど、ここでは一例を解決する別の方法です:

@RequestMapping(value={ "/json/{type}", "/json" }, method=RequestMethod.GET) 
public @ResponseBody TestBean typedTestBean(
    @PathVariable Map<String, String> pathVariables, 
    @RequestParam("track") String track) { 

    if (pathVariables.containsKey("type")) { 
     return new TestBean(pathVariables.get("type")); 
    } else { 
     return new TestBean(); 
    } 
} 
+1

ありがとう、スプリング4.2で期待どおりに動作します – Edgar

+0

私はこれを常時使用しています。これは、異なるuriの型を扱う単一のメソッドex:{"/ json/{type}"、 "/ json/{type}/json/{abc} "、"/json/{type}/{abc}/{something} "、"/json "} – Vaibs

-3
$.ajax({ 
      type : 'GET', 
      url : '${pageContext.request.contextPath}/order/lastOrder', 
      data : {partyId : partyId, orderId :orderId}, 
      success : function(data, textStatus, jqXHR) }); 

@RequestMapping(value = "/lastOrder", method=RequestMethod.GET) 
public @ResponseBody OrderBean lastOrderDetail(@RequestParam(value="partyId") Long partyId,@RequestParam(value="orderId",required=false) Long orderId,Model m) {} 
+3

一部のテキストを編集したい場合がありますあなたの答えで、なぜこのことが手元にある問題(4年後)の解決に貢献しているのかを説明する*理由を説明してください。 – Qirel

+0

助けにはならないでしょう。答えは完全に間違っています。 – Phil

67

あなたは春4.1とJava 8あなたを使用している場合Spring MVCので@RequestParamでサポートされてjava.util.Optional@PathVariable@RequestHeader@MatrixVariableを使用することができます -

@RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET) 
public @ResponseBody TestBean typedTestBean(
    @PathVariable Optional<String> type, 
    @RequestParam("track") String track) {  
    if (type.isPresent()) { 
     //type.get() will return type value 
     //corresponds to path "/json/{type}" 
    } else { 
     //corresponds to path "/json" 
    }  
} 
+0

これは確実に機能しますか?あなた自身の答え[ここ](http://stackoverflow.com/a/34670775/1345021)は、{type}がパスにないとコントローラがヒットしないことを示唆しています。 私は、PathVariable Mapがより良いアプローチであると思います。あるいは、別のコントローラを使用しています。 –

+3

はい、 ''/json/{type} ''があり、型が存在しない場合はヒットしません(リンクされた答えが示唆しているように)、 'value = {"/json/{type} "/ json"} '。したがって、いずれかが一致した場合、コントローラメソッドがヒットします。 –

+0

同じ値などのタイプがRequestParamとRequestParamになる可能性はありますか? – zygimantus

関連する問題