我在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
答案 0 :(得分:0)
有很多方法可以执行此操作,但是您可以例如在会话中存储此值,这很有意义,因为您打算使用这些值将请求移到异常处理中。
在控制器中收到信息后,将其存储在会话中:
@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)
这样您就可以了解失败原因的更多信息,并且知道该怎么做。