SpringMVCコントローラーに次の作業コードがあります。
@RequestMapping(value = "/register", method = RequestMethod.GET)
public void registerForm(Model model) {
model.addAttribute("registerInfo", new UserRegistrationForm());
}
@RequestMapping(value = "/reg", method = RequestMethod.POST)
public String create(
@Valid @ModelAttribute("registerInfo") UserRegistrationForm userRegistrationForm,
BindingResult result) {
if (result.hasErrors()) {
return "register";
}
userService.addUser(userRegistrationForm);
return "redirect:/";
}
要するにcreate
、検証を試みUserRegistrationForm
ます。フォームにエラーがある場合、エラーメッセージが表示されるフォームフィールドが入力された同じページにユーザーが残ります。
ここで、同じ動作を別のページに適用する必要がありますが、ここで問題があります。
@RequestMapping(value = "/buy/{buyId}", method = RequestMethod.GET)
public String buyGet(HttpServletRequest request, Model model, @PathVariable long buyId) {
model.addAttribute("buyForm", new BuyForm());
return "/buy";
}
@RequestMapping(value = "/buy/{buyId}", method = RequestMethod.POST)
public String buyPost(@PathVariable long buyId,
@Valid @ModelAttribute("buyForm") BuyForm buyForm,
BindingResult result) {
if (result.hasErrors()) {
return "/buy/" + buyId;
}
buyForm.setId(buyId);
buyService.buy(buyForm);
return "redirect:/show/" + buyId;
}
動的 URL の問題に直面しました。フォームにエラーがある場合は、現在のページに留まるように同じページ テンプレートを指定する必要がありますがbuyId
、パス変数として渡す必要もあります。この 2 つの要件の競合はどこにありますか。このコードをそのままにしておくと、エラーが発生します (テンプレート プロセッサとしてThymeleafを使用しています)。
Error resolving template "/buy/3", template might not exist or might not be accessible by any of the configured Template Resolvers
のようなものを書くこともできますreturn "redirect:/buy/" + buyId
が、この場合、フォーム オブジェクトのすべてのデータとエラーが失われます。
buyPost
メソッドと同じ動作をメソッドに実装するにはどうすればよいcreate
ですか?