I want to have the following method:
@ExceptionHandler(MyRuntimeException.class)
public String myRuntimeException(MyRuntimeException e, RedirectAttributes redire
Note that this is actually supported out-of-the-box by Spring 4.3.5+ (see SPR-14651 for more details).
I've managed to get it working using the RequestContextUtils class. My code looks like this
@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;
}
Then in the jsp page I simply access the attribute
<c:if test="${myAttribute}">
<script type="text/javascript">
// other stuff here
</script>
</c:if>
Hope it helps!
Since Spring 4.3.5 (SPR-14651) you can use stright away your first aproach:
@ExceptionHandler(MyRuntimeException.class)
public String myRuntimeException(MyRuntimeException e, RedirectAttributes redirectAttrs){
redirectAttrs.addFlashAttribute("error", e);
return "redirect:someView";
}
I am looking at the JavaDoc and I don't see where RedirectAttributes is a valid type that is accepted.
You could always forward then redirect (or redirect twice).. First to another request mapping where you have normal access to RedirectAttributes, then again to your final destination.
@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";
}