5

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ですか?

4

3 に答える 3

2

* Bean を検証するためにHibernate Validator APIを使用しています。エラー メッセージの表示とともにフォーム データを保持するには、次の 3 つのことを行う必要があります。

  1. Bean に注釈を付けます (例: @NotEmpty、@Pattern、@Length、@Email など)。

ここに画像の説明を入力

  1. コントローラーの内部:

    @Controller public class RegistrationController {

    @Autowired
    private RegistrationService registrationService;
    
    @RequestMapping(value="register.htm", method=RequestMethod.GET, params="new")
    public String showRegistrationForm(Model model) {
        if (!model.containsAttribute("employee")) {
            model.addAttribute("employee", new Employee());
        }
        return "form/registration";
    }
    
    @RequestMapping(value="register.htm", method=RequestMethod.POST)
    public String register(@Valid @ModelAttribute("employee") Employee employee, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
        if (bindingResult.hasErrors()) {
            redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.employee", bindingResult);
            redirectAttributes.addFlashAttribute("employee", employee);
            return "redirect:register.htm?new";
        }
        registrationService.save(employee);
        return "workspace";
    }
    // ....
    

    }

  2. ビュー/jsp を更新して、エラー メッセージを保持します。

ここに画像の説明を入力

この記事はきっと役に立つはずです。

于 2013-11-09T09:44:12.233 に答える
0

POST 実装を次のように変更できます。

@RequestMapping(value = "/buy/{buyId}", method = RequestMethod.POST)
public String buyPost(@PathVariable long buyId,
                          @Valid @ModelAttribute("buyForm") BuyForm buyForm,
                          BindingResult result) {

    buyForm.setId(buyId); // important to do this also in the error case, otherwise, 
                          // if the validation fails multiple times it will not work.

    if (result.hasErrors()) {
        byForm.setId(buyId);
        return "/buy/{buyId}";
    }

    buyService.buy(buyForm);
    return "redirect:/show/{buyId}";
}

@PostMapping("/buy/{buyId}")オプションで、 Spring 4.3 以降を使用している場合は、メソッドにアノテーションを付けることもできます。

于 2016-11-25T09:44:35.507 に答える