如果我使用@ControllerAdvice
和@ExceptionHandler
处理异常如何在同一个视图中向用户显示错误消息。对于前者假设用户在" customer / new"视图。并调用" save"动作,然后它将转到控制器,我调用方法服务层。但是如果在服务层发生内部异常,我想在同一个" customer / new"上显示错误消息。图。
我编写了一个单独的类来处理异常,如下所示。
@ControllerAdvice
public class DefaultControllerHandler {
@ExceptionHandler({MyProjectException.class, DataAccessException.class})
public ResponseEntity<String> handleInternalErrorException(Exception e) {
logger.error(e.getMessage(), e);
return new ResponseEntity<String>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
欣赏您的想法。 谢谢!
答案 0 :(得分:0)
您可以使用Flash重定向属性。
@RequestMapping(value = "/administrator/users", method = RequestMethod.POST)
public String adminAddUser(@ModelAttribute("user") @Valid User user, BindingResult bindingResult, Model model, RedirectAttributes redirectAttrs) {
String redirectUrl = "/administrator/users";
try {
userService.save(user);
} catch (YourServiceException e) {
redirectAttrs.addFlashAttribute("errorMessage", "error occured: " + e.getMessage());
redirectAttrs.addFlashAttribute("userObject", user);
redirectUrl = "/administrator/users?form"; // If error - return to same view
}
return "redirect:" + redirectUrl;
}
@RequestMapping(value = "/administrator/users", params = "form", method = RequestMethod.GET, produces = "text/html")
public String adminUsersList(@ModelAttribute("errorMessage") final String errorMessage, @ModelAttribute("userObject") final User user Model model) {
if(user == null) {
user = new User();
}
model.addAttribute("user", user);
if(errorMessage != null) {
model.addAttribure("errorMessage", errorMessage);
}
return "administrator/users/create";
}
在这种情况下,您必须在users.jsp页面上显示部分以显示errorMessaage。像这样:
<c:if test="${not empty errorMessage}">${errorMessage}</c:if>
如果你可以从控制器方法获取url路径和redirectAttributes - 你可以通过@ControllerAdvice
来实现答案 1 :(得分:0)
我能想到的唯一解决方案是调用服务层AJAX,然后仅在没有错误的情况下重定向,如果没有显示错误消息。
在您的Javascript文件中可能看起来像这样
$("#someButton").click(function(){
//make your ajax call
if (noError){
window.location.href = contextPath+"/somePath";
}
else{
//display your error message
}
});