web-dev-qa-db-ja.com

Spring MVC-フォームへの複数の送信ボタン

フォームに2つの送信ボタンを投稿し、各ボタンアクションを異なるコントローラーにマップしようとしています。ここに私のマッピングがあります

@RequestMapping(value="/save", method=RequestMethod.POST, params="save")
@RequestMapping(value="/save", method=RequestMethod.POST, params="renew")

送信ボタンは次のようになります-

<input type="submit" name="save" class="button" value="Save" />
<input type="submit" name="renew" class="button" value="Renew" />

マッピングからわかるように、どのボタンがクリックされたかを区別するために、paramsの使用に依存しています。問題は、それが時間の90%で動作することですが、時々私は以下の例外を受け取ります-

Java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8090/myapp/save': {public Java.lang.String com.myapp.SaveController.save(MyEntity,javax.servlet.http.HttpSession), public Java.lang.String com.myapp.SaveController.saveAndRenew(MyEntity,javax.servlet.http.HttpSession)}
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.Java:248)
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.Java:194)

奇妙なことに、これが発生してページを再送信すると、その後はすべて正常に機能します。私がやろうとしていることを達成するためのより良い方法はありますか?

ありがとう!

38
user558122

フォームにこれらのボタンが指定されている場合:

input type="submit" class="button" name="save" value="Save"
input type="submit" class="button" name="delete" value="Delete"
input type="submit" class="button" name="cancel" value="Cancel"

1つのコントローラーで押されたボタンに応じて、異なるURLリクエストにリダイレクトできます。

キャンセルボタンの場合、

@RequestMapping(params = "cancel", method = RequestMethod.POST)
public String cancelUpdateUser(HttpServletRequest request) {
    return "redirect:/users.html";
}

リクエストマッピングは、params name = cancelが含まれている場合、ポストリクエストをスキャンします。

保存ボタンの場合、

@RequestMapping(params = "save", method = RequestMethod.POST)
public String saveUser(HttpServletRequest request, @ModelAttribute User user, BindingResult result, SessionStatus status) {
    // validate your result
    // if no errors, save it and redirect to successView.
}
38
xyzlast

何故なの:

<input type="submit" name="action" value="save" />

その後:

@RequestMapping(value="/save", method=RequestMethod.POST)
public String handlePost(@RequestParam String action){

    if( action.equals("save") ){
       //handle save
    }
    else if( action.equals("renew") ){
       //handle renew
    }

} 
33
Dan

params属性のみが異なる同じ@RequestMappingを持つコントローラーメソッドがさらにある場合は、明示的に記述する必要があります。

  • どのパラメーターがリクエストに存在することになっているのか、例えばparams="save"
  • どのパラメーターがリクエストに存在することは想定されていません。 params="!save"

あなたの場合:

@RequestMapping(value="/save", method=RequestMethod.POST, params={"save", "!renew"})
@RequestMapping(value="/save", method=RequestMethod.POST, params={"renew", "!save"})

これにより、エラーが修正されますHTTPパスにマッピングされた曖昧なハンドラーメソッド...

Spring Web API 4.0.x-RequestMapping#params を参照してください

10
lu_ko

これに似た方法でコントローラーを1つ作成するだけです

@RequestMapping(value="/save", method=RequestMethod.POST)
public String handlePost(@RequestParam(required=false , value = "save") String saveFlag , @RequestParam(required=false , value = "renew") String renewFlag){

if(saveFlag != null{
   //handle save
}
else if(renewFlag !=null{
   //handle renew
}

} 
7
J. Moreno

もう1つのソリューション:

@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"})
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"})
3
Premraj