バックグラウンド
エラーメッセージクラスがあります:
@XmlRootElement
public class ErrorMessage {
private String message;
public ErrorMessage() {
}
public ErrorMessage(String message) {
this.message = message;
}
public String getError() {
return message;
}
public void setError(String message) {
this.message = message;
}
}
このクラスは、Spring MVC REST コントローラーの @ExceptionHandler への戻り値として割り当てられています。
@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
ErrorMessage handleException(RuntimeException e) {
return new ErrorMessage("something went wrong");
}
クライアントが をヘッダーとしてRuntimeException
リクエストを発行した後にトリガーするたびに、正しいステータス コードと一致する JSON 本文を含むレスポンスを受け取ります。application/json
Accept
{"error":"something went wrong"}
Accept
または、ヘッダーがapplication/xml
次の場合、XML 本文が受信されます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<errorMessage><error>something went wrong</error></errorMessage>
問題
ここで、代わりにHandlerExceptionResolverを実装してこのソリューションを生成したいと思います。これにより、すべてのコントローラーにコピー/貼り付けする必要がなくなり@ExceptionHandler
ます (または、他のコントローラーが拡張できる共通の「親コントローラー」を作成します)。
ただし、AbstractHandlerExceptionResolver.doResolveException()ModelAndView
メソッドは適切ではなくa を返すErrorMessage
ため、次のことを試しました。
public class RuntimeExceptionHandlerExceptionResolver extends AbstractHandlerExceptionResolver {
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
if (ex instanceof RuntimeException) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
ModelAndView mav = new ModelAndView();
mav.addObject("error", "something went wrong");
return mav;
}
return null;
}
}
mav.addObject()
デバッグすると、メソッドが呼び出されていることがわかります。クライアント側の応答には予期されたステータス コードがありますが、コンテンツ タイプは、元の要求のヘッダーでtext/html
指定された JSON または XLM コンテンツではなく、本文に html が含まれています。Accept
(ちなみに、上記の例の実際の例外、応答コード、およびテキスト メッセージは重要ではありません。これらは単純な例にすぎません。)
春のバージョン: 3.1.1.RELEASE