从异常重定向回来后如何将数据保留在表单中
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
有很多方法可以做到这一点,但是您可以将这些值存储在会话中,这是有道理的,因为您希望这些值超越请求进入异常处理。
当您在控制器中收到信息时,将其存储在会话中:
@PostMapping("/signup_do")
public String register(HttpSession session, Account account) {
session.setAttribute("account", account);
accountManagement.accountRegistration(account);
return "Success";
}
在异常处理程序中恢复帐户信息并将其传递给模型:
@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)
这样您就可以了解有关失败原因的更多信息,并知道相应的操作。
我在 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
有很多方法可以做到这一点,但是您可以将这些值存储在会话中,这是有道理的,因为您希望这些值超越请求进入异常处理。
当您在控制器中收到信息时,将其存储在会话中:
@PostMapping("/signup_do") public String register(HttpSession session, Account account) { session.setAttribute("account", account); accountManagement.accountRegistration(account); return "Success"; }
在异常处理程序中恢复帐户信息并将其传递给模型:
@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)
这样您就可以了解有关失败原因的更多信息,并知道相应的操作。