从异常重定向回来后如何将数据保留在表单中

How to keep the data in the form after redirecting back from an exception

我在 html(Thymeleaf 模板)中有一个注册表单,一旦我提交此表单,就会调用以下控制器方法:

@PostMapping("/signup_do")
public String register(Account account) {
    accountManagement.accountRegistration(account);

    return "Success";
}

现在 accountRegistration 是一个抛出 SignupFormException 的服务方法,它扩展了 RuntimeException。此异常在与带有 @ExceptionHandler 注释的控制器相同的 class 中处理,如下所示:

@ExceptionHandler(value=SignupFormException.class)
public String handle() {
    return "redirect:/signup";
}

这 return 是一个空的注册表单,因为遇到异常。但我希望可以保留填充的值。

如果我可以将最初传递给 /signup_do 控制器的帐户对象接收到此异常处理程序方法中,我就可以轻松地 return 返回模型对象。但以下不起作用:

@ExceptionHandler(value=SignupFormException.class)
public String handle(Account account) { //trying to get the account object
    System.out.println(account.getUsername());
    return "redirect:/signup";
}

抛出的异常是:

java.lang.IllegalStateException: Could not resolve parameter [0] in public java.lang.String tv.redore.controller.AccountController.handle(tv.redore.entity.Account): No suitable resolver

有很多方法可以做到这一点,但是您可以将这些值存储在会话中,这是有道理的,因为您希望这些值超越请求进入异常处理。

  1. 当您在控制器中收到信息时,将其存储在会话中:

    @PostMapping("/signup_do")
    public String register(HttpSession session, Account account) {
        session.setAttribute("account", account);
        accountManagement.accountRegistration(account);
    
        return "Success";
    }
    
  2. 在异常处理程序中恢复帐户信息并将其传递给模型:

    @ExceptionHandler(value=SignupFormException.class)
    public String handle(Model model, HttpServletRequest req) {
        Account account = req.getSession().getAttribute("account");
        req.getSession().removeAttribute("account"); //Important, you don't want to keep useless objects in your session
        model.addAttriute(account.getUsername());
        return "redirect:/signup";
    }
    

您甚至可以将异常添加到处理程序中:

public String handle(Model model, HttpServletRequest req)

这样您就可以了解有关失败原因的更多信息,并知道相应的操作。