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

时间:2019-07-14 15:03:34

标签: java html spring-boot thymeleaf user-registration

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

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

    return "Success";
}

现在accountRegistration是一个服务方法,该方法引发SignupFormException,该方法扩展了RuntimeException。使用@ExceptionHandler注释在与控制器相同的类中处理此异常,如下所示:

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

这会在面对异常时返回一个空的注册表单。但我希望保留可以的值。

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

@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 个答案:

答案 0 :(得分:0)

有很多方法可以执行此操作,但是您可以例如在会话中存储此值,这很有意义,因为您打算使用这些值将请求移到异常处理中。

  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)

这样您就可以了解失败原因的更多信息,并且知道该怎么做。