2

如果我处理异常@ControllerAdvice以及@ExceptionHandler如何在同一视图中向用户显示错误消息。例如。假设用户在“客户/新”视图中。并调用“保存”操作,然后它将转到控制器,我调用方法服务层。但是如果服务层发生内部异常,我想在同一个“客户/新”视图上显示错误消息。

我编写了一个单独的类来处理如下异常。

@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);

    }
}

欣赏你的想法。谢谢!

4

2 回答 2

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 页面上设置部分以显示错误消息。像这样的东西:

<c:if test="${not empty errorMessage}">${errorMessage}</c:if>

如果您可以从控制器方法中获取 url 路径和 redirectAttributes - 您可以通过 @ControllerAdvice 执行此操作

于 2013-08-18T13:27:26.613 回答
0

我能想到的唯一解决方案是调用服务层 AJAX,然后仅在没有错误的情况下重定向,如果不显示错误消息。

在您的 Javascript 文件中可能看起来像这样

$("#someButton").click(function(){
         //make your ajax call
         if (noError){
    window.location.href = contextPath+"/somePath";
         }
        else{
           //display your error message
       }
});
于 2013-08-19T01:21:03.030 回答