次の方法が必要です。
@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";
}
私が今抱えている問題は、メッセージがセッションでスタックしていることです...
これは、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>
それが役に立てば幸い!
いつでも転送してからリダイレクトできます(または2回リダイレクトできます)。最初に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";
}
Spring 4.3.5( SPR-14651 )以降、最初のアプローチをすぐに使用できます。
@ExceptionHandler(MyRuntimeException.class)
public String myRuntimeException(MyRuntimeException e, RedirectAttributes redirectAttrs){
redirectAttrs.addFlashAttribute("error", e);
return "redirect:someView";
}
JavaDoc を調べていますが、RedirectAttributesが受け入れられる有効なタイプである場所がわかりません。