3

コードを .jsp に渡しながら、考えられるすべてのエラー コードを処理する方法はありますか? ここでは、モデルに追加される 404 を渡す単一のエラー ページがあります。考えられるすべてのエラー コードにエラー ページを追加するのではなく、エラーをキャッチしてコードをコントローラー/jsp ファイルに渡すより良い方法はありますか?

コントローラ

@RequestMapping(value="/error/{code}", method=RequestMethod.GET)
    public String error(@PathVariable("code") String code, Model model)
    {
        model.addAttribute("code", code);
        return "error";
    }

web.xml

<error-page>
    <error-code>404</error-code>
    <location>/error/404</location>
</error-page>
4

1 に答える 1

1

Springに汎用例外リゾルバーを登録して、すべての例外をキャッチし、のレンダリングに変換することができますerror.jsp

codeメンバーを持つ、ビジネスロジックによってスローされる特殊なRuntimeExceptionを使用します。

public class MyException extends RuntimeException {
    private final Integer errorCode;

    public MyException(String message, Throwable cause, int errorCode) {
        super(message, cause);
        this.errorCode = errorCode;
    }
}

codeまたは、例外メッセージにある既存のRuntimeExceptionインスタンスに依存します。

および/またはメッセージを抽出し、codeそれに応じてHttpServletResponseステータスとModelAndViewを設定します。

例えば:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component(DispatcherServlet.HANDLER_EXCEPTION_RESOLVER_BEAN_NAME)
public class GenericHandlerExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
        ModelAndView mav = new ModelAndView("error");

        if (e instanceof MyException) {
            MyException myException = (MyException) e;
            String code = myException.getCode();

            // could set the HTTP Status code
            response.setStatus(HttpServletResponse.XXX);

            // and add to the model
            mav.addObject("code", code);
        } // catch other Exception types and convert into your error page if required

        return mav;
    }
}
于 2013-02-05T09:13:15.907 に答える