15

我想要以下方法:

@ExceptionHandler(MyRuntimeException.class)
public String myRuntimeException(MyRuntimeException e, RedirectAttributes redirectAttrs){//does not work
    redirectAttrs.addFlashAttribute("error", e);
    return "redirect:someView";
}

我得到一个:

java.lang.IllegalStateException: No suitable resolver for argument [1] type=org.springframework.web.servlet.mvc.support.RedirectAttributes]

有没有办法从一个执行重定向@ExceptionHandler?或者也许有某种方法可以规避这个限制?

编辑:

我修改了我的异常处理程序如下:

@ExceptionHandler(InvalidTokenException.class)
public ModelAndView invalidTokenException(InvalidTokenException e, HttpServletRequest request) {
RedirectView redirectView = new RedirectView("signin");
return new ModelAndView(redirectView , "message", "invalid token/member not found");//TODO:i18n
}

这是可能引发异常的方法:

@RequestMapping(value = "/activateMember/{token}", method = RequestMethod.GET, produces = "text/html")
public String activateMember(@PathVariable("token") String token) {
    signupService.activateMember(token);
    return "redirect:memberArea/index";
}

我修改的异常处理程序的问题在于它系统地将我重定向到以下 URL:

http://localhost:8080/bignibou/activateMember/signin?message=invalid+token%2Fmember+not+found 

代替:

http://localhost:8080/bignibou/signin?message=invalid+token%2Fmember+not+found

编辑 2

这是我修改后的处理程序方法:

@ExceptionHandler(InvalidTokenException.class)
public String invalidTokenException(InvalidTokenException e, HttpSession session) {
session.setAttribute("message", "invalid token/member not found");// TODO:i18n
return "redirect:../signin";
}

我现在遇到的问题是消息卡在会话中...

4

4 回答 4

26

请注意,Spring 4.3.5+ 实际上支持开箱即用(有关更多详细信息,请参阅SPR-14651)。

我已经设法使用 RequestContextUtils 类让它工作。我的代码看起来像这样

@ExceptionHandler(MyException.class)
public RedirectView handleMyException(MyException ex,
                             HttpServletRequest request,
                             HttpServletResponse response) throws IOException {
    String redirect = getRedirectUrl(currentHomepageId);

    RedirectView rw = new RedirectView(redirect);
    rw.setStatusCode(HttpStatus.MOVED_PERMANENTLY); // you might not need this
    FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(request);
    if (outputFlashMap != null){
        outputFlashMap.put("myAttribute", true);
    }
    return rw;
}

然后在jsp页面中我只需访问属性

<c:if test="${myAttribute}">
    <script type="text/javascript">
      // other stuff here
    </script>
</c:if>

希望能帮助到你!

于 2013-04-10T17:18:36.860 回答
7

您总是可以转发然后重定向(或重定向两次)。首先到您可以正常访问 RedirectAttributes 的另一个请求映射,然后再次到您的最终目的地。

    @ExceptionHandler(Exception.class)
    public String handleException(final Exception e) {

        return "forward:/n/error";
    }

    @RequestMapping(value = "/n/error", method = RequestMethod.GET)
    public String error(final RedirectAttributes redirectAttributes) {

        redirectAttributes.addAttribute("foo", "baz");
        return "redirect:/final-destination";
    }
于 2013-09-12T22:13:34.143 回答
3

我正在查看JavaDoc,但看不到 RedirectAttributes 在哪里是可以接受的有效类型。

于 2013-02-19T18:26:04.927 回答
1

从 Spring 4.3.5 ( SPR-14651 ) 开始,您可以立即使用您的第一个方法:

@ExceptionHandler(MyRuntimeException.class)
public String myRuntimeException(MyRuntimeException e, RedirectAttributes redirectAttrs){
    redirectAttrs.addFlashAttribute("error", e);
    return "redirect:someView";
}
于 2018-05-29T11:47:25.613 回答