@RequestParam対@PathVariable


355

違いは何である@RequestParam@PathVariable特殊文字の処理中には?

+@RequestParamスペースとして受け入れられました。

の場合@PathVariable+として受け入れられました+

回答:


499

URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013が2013年12月5日にユーザー1234の請求書を取得する場合、コントローラーメソッドは次のようになります。

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

また、リクエストパラメータはオプションにすることができ、Spring 4.3.3以降、パス変数もオプションにすることができます。ただし、これによりURLパス階層が変更され、要求マッピングの競合が発生する可能性があります。たとえば/user/invoices、ユーザーの請求書nullやID「invoices」のユーザーの詳細を提供しますか?


11
@PathVariable任意のRequestMethodで使用できます
倉井銀行2015

1
@AlexO:これはjava8とは何の関係もありません。java5およびSpring3.0でも機能します。重要なのは、コードがデバッグを有効にしてコンパイルされていることです。
ラルフ

2
:代わりに「-parameters」を使用して、Javaのそれはまた、デバッグなしで動作8以来のJava 8の前に、デバッグで正しい、この作品@Ralph docs.spring.io/spring/docs/current/spring-framework-reference/... docs.oracle .com / javase / tutorial / reflect / member /…
AlexO

1
@ user3705478:Springはこれがリクエストハンドラメソッドであることを知る必要があるので、私はそうは思いません。(そしてもちろん:@PathParam uriテンプレートにプレースホルダーがある場合にのみ機能します)
Ralph

2
@ user3705478:@PathParamjavax.ws.rsアノテーションです。docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph

112

リクエストからクエリパラメータ値にアクセスするために使用される@RequestParamアノテーション。次のリクエストURLを見てください。

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

上記のURLリクエストでは、param1とparam2の値に次のようにアクセスできます。

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

以下は、@ RequestParamアノテーションでサポートされているパラメーターのリストです。

  • defaultValue –これは、リクエストに値がないか空の場合のフォールバックメカニズムとしてのデフォルト値です。
  • name –バインドするパラメーターの名前
  • 必須 –パラメータが必須かどうか。trueの場合、そのパラメーターの送信に失敗すると失敗します。
  • value –これはname属性のエイリアスです

@PathVariable

@ PathVariableは、着信要求のURIで使用されるパターンを識別します。以下のリクエストURLを見てみましょう。

http:// localhost:8080 / springmvc / hello / 101?param1 = 10&param2 = 20

上記のURLリクエストは、Spring MVCで次のように記述できます。

@RequestMapping("/hello/{id}")    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}

@ PathVariableアノテーションには、リクエストURIテンプレートをバインドするための属性値が1つだけあります。単一のメソッドで複数の@ PathVariableアノテーションを使用できます。ただし、同じパターンを持つメソッドは1つだけにしてください。

また、もう1つの興味深い注釈があります。 @ MatrixVariable

http:// localhost:8080 / spring_3_2 / matrixvars / stocks; BT.A = 276.70、+ 10.40、+ 3.91; AZN = 236.00、+ 103.00、+ 3.29; SBRY = 375.50、+ 7.60、+ 2.07

そしてそのためのControllerメソッド

 @RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
  public String showPortfolioValues(@MatrixVariable Map<String, List<String>> matrixVars, Model model) {

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });

    List<List<String>> outlist = map2List(matrixVars);
    model.addAttribute("stocks", outlist);

    return "stocks";
  }

ただし、以下を有効にする必要があります。

<mvc:annotation-driven enableMatrixVariables="true" >

userNameタイプparam などの文字列はありますか?私はそれを変数にすることに傾倒していますが、それもパラメータかもしれません。
cst1992

1
..そして、これが元の投稿です: -javabeat.net/spring-mvc-requestparam-pathvariable
Mehraj Malik

@PathParam@RequestParam使用せずに宣言すること@RequestMapping
sofs1

29

@RequestParamは、http:// localhost:8080 / calculation / pow?base = 2&ext = 4のようなクエリパラメータ(静的な値)に使用されます

@PathVariableは、http:// localhost:8080 / calculation / sqrt / 8などの動的な値に使用されます。

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
    int pow = (int) Math.pow(base1, ext1);
    return pow;
}

@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
    double sqrtnum=Math.sqrt(num1);
    return sqrtnum;
}

シンプルで明確な@alok
anand krish

12

1)クエリパラメータ@RequestParamを抽出するために使用されます

http://localhost:3000/api/group/test?id=4

@GetMapping("/group/test")
public ResponseEntity<?> test(@RequestParam Long id) {
    System.out.println("This is test");
    return ResponseEntity.ok().body(id);
}

while @PathVariableは、URIから直接データを抽出するために使用されます。

http://localhost:3000/api/group/test/4

@GetMapping("/group/test/{id}")
public ResponseEntity<?> test(@PathVariable Long id) {
    System.out.println("This is test");
    return ResponseEntity.ok().body(id);
}

2)@RequestParamデータがほとんどクエリパラメータで渡される従来のWebアプリケーションでより便利ですが、@PathVariableURLに値が含まれるRESTful Webサービスに適しています。

3)必須属性が次の場合、属性を使用してクエリパラメータが存在しないか空の場合、@RequestParamアノテーションはデフォルト値を指定できます。defaultValuefalse

@RestController
@RequestMapping("/home")
public class IndexController {

    @RequestMapping(value = "/name")
    String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
        return "Required element of request param";
    }

}

1
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
 http://localhost:8080/employee/call/7865467

 @RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
 public List<Calls> getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = status", required = false) String callStatus) {

    }

http://localhost:8080/app/call/7865467?status=Cancelled

@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = status", required = true) String callStatus) {

}

1

両方の注釈は、まったく同じように動作します。

2つの特殊文字「!」のみ と '@'はアノテーション@PathVariableと@RequestParamで受け入れられます。

動作を確認するために、コントローラーを1つだけ含むSpring Bootアプリケーションを作成しました。

 @RestController 
public class Controller 
{
    @GetMapping("/pvar/{pdata}")
    public @ResponseBody String testPathVariable(@PathVariable(name="pdata") String pathdata)
    {
        return pathdata;
    }

    @GetMapping("/rpvar")
    public @ResponseBody String testRequestParam(@RequestParam("param") String paramdata)
    {
        return paramdata;
    }
}

次のリクエストを打つと、同じ応答が得られました。

  1. localhost:7000 / pvar /!@#$%^&*()_ +-= [] {} |; ': "、。/ <>?
  2. localhost:7000 / rpvar?param =!@#$%^&*()_ +-= [] {} |; ': "、。/ <>?

!@は両方のリクエストで応答として受信されました


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.