web-dev-qa-db-ja.com

spring mvcを使用して@RequestParamを使用して複数のパラメータをキャプチャする方法は?

ハイパーリンクがクリックされ、次のパラメーターリストmyparam=myValue1&myparam=myValue2&myparam=myValue3でURLが起動されるとします。 Spring MVCで@RequestParamを使用してすべてのパラメータをキャプチャするにはどうすればよいですか?

私の要件は、すべてのパラメーターをキャプチャして、マップに配置する必要があることです。

助けてください!

35
@RequestMapping(value = "users/newuser", method = RequestMethod.POST)   
public String saveUser(@RequestParam Map<String,String> requestParams) throws Exception{
   String userName=requestParams.get("email");
   String password=requestParams.get("password");

   //perform DB operations

   return "profile";
}

上記の方法でRequestParamを使用できます。

39
Touchstone

あなたが得ることができないようです

Map<String,String>

すべてのパラメータが同じ名前「myparam」を持っているため

代わりにこれを試してください:

public ModelAndView method(@RequestParam("myparam") List<String> params) { }
23

すべてのパラメーターを一度に取得するには、これを試してください:

public ModelAndView postResultPage(@RequestParam MultiValueMap<String, String> params)

この機能については、@RequestParam Java doc(3.段落):

メソッドパラメーターをWeb要求パラメーターにバインドする必要があることを示す注釈。サーブレットおよびポートレット環境の注釈付きハンドラーメソッドでサポートされています。

メソッドパラメータタイプがMapで、リクエストパラメータ名が指定されている場合、リクエストパラメータ値は、適切な変換戦略が利用可能であると仮定してMapに変換されます。

メソッドパラメータがMap<String, String> または MultiValueMap<String, String>およびパラメーター名が指定されていない場合、マップパラメーターにはすべてのリクエストパラメーター名と値が入力されます。

12
Ralph

Spring 3.0以降、 MultiValueMap を使用してこれを実現することもできます。

初歩的な例は次のとおりです。

public String someMethod(@RequestParam MultiValueMap<String,String> params) {

    final Iterator<Entry<String, List<String>>> it = params.entrySet().iterator();

    while(it.hasNext()) {
        final String k = it.next().getKey();
        final List<String> values = it.next().getValue();
    }

    return "dummy_response";

}
6
Brian

Spring mvcはList<Object>Set<Object>およびMap<Object>パラメーターをサポートできますが、@ RequestParamは使用できません。

オブジェクトがList<Object>の場合、例としてUser.Javaを使用すると、次のようになります。

public class User {
    private String name;
    private int age;

    // getter and setter
}

そして、あなたはList<User>のパラメータを渡したい、あなたはこのようなURLを使用することができます

http://127.0.0.1:8080/list?users[0].name=Alice&users[0].age=26&users[1].name=Bob&users[1].age=16

URLをエンコードすることを忘れないでください。エンコード後のURLは次のようになります。

http://127.0.0.1:8080/list?users%5B0%5D.name=Alice&users%5B0%5D.age=26&users%5B1%5D.name=Bob&users%5B1%5D.age=16

List<Object>Set<Object>、およびMap<Object>の例は、 my github に表示されます。

0
Frank.Chang

誰かがSpring Bootで同じことをしようとしている場合は、RequestBodyの代わりにRequestParamを使用してください

0
Akki