4

Spring を使用して、resolveException メソッドでアプリケーションの予期しない例外をキャッチする SimpleMappingExceptionResolver を用意しました。このメソッドでは、エラー メッセージ テキストを HTTP クライアントに返す ModelAndView を返します。コードは次のとおりです。

public class UnExpectedExceptionResolver extends SimpleMappingExceptionResolver {

private Log logger = LogFactory.getLog(this.getClass().getName());
private ResourceBundleMessageSource messageSource;

@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {

    // let the end user know that an error occurred
    Locale locale = RequestContextUtils.getLocale(request);
    String messageText = messageSource.getMessage("systemError", null, locale);
    Message message = new Message(messageText, MessageType.ERROR);
    ModelAndView mav = new ModelAndView();
    mav.setView(new MappingJacksonJsonView());
    mav.addObject("message", message);
    return mav;
}

そのため、応答テキストがメッセージ (JSON) である HTTP ステータス コード 200 で応答が返されます。残念ながら、クライアントは 200 コードのために有効な応答であると考え、そのように処理しようとします。次のようにHTTPステータスコードを500に設定してみました:

 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server Error");

直前に

 return mav;

声明。残念ながら、これは JSON メッセージではなく、内部エラーを示す HTML ページを返します。JSON メッセージを返し、サーバー エラー (または何らかのエラー) をクライアントに示すにはどうすればよいですか? 具体的には、AJAX 呼び出しでクライアントのエラー関数が呼び出され、メッセージ データがクライアントに送り返されることを期待しています。参考までに、クライアント側で jQuery を使用しています。

4

4 に答える 4

10

サーバーへのリクエストをどのように正確に行っているのかわかりません。しかし、これは私がそれを行う方法です。

@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR, reason = "your message")
public void handleException(IllegalStateException ex, HttpServletResponse response) throws IOException
{
}

クライアント側で

$.ajax({
type : "POST",
url : urlString,
data : params,
dataType : 'json',
success : function(data) {
    //  do something}
error: function (xhr, ajaxOptions, thrownError) {
    alert(xhr.status); //This will be 500
    alert(xhr.responseText); // your message
    //do stuff
  }
于 2013-01-24T06:20:39.453 に答える
6

Spring 3.2 では、@ControllerAdvice注釈付きクラス内に例外ハンドラーを配置できます。

Spring 3.2 ドキュメントから

で注釈が付けられたクラスには、、、およびメソッドを@ControllerAdvice含めることができ、これらは、それらが宣言されているコントローラー階層とは対照的に、コントローラー階層全体のメソッドに適用されます。は、クラスパス スキャンによって実装クラスを自動検出できるようにするコンポーネント アノテーションです。@ExceptionHandler@InitBinder@ModelAttribute@RequestMapping@ControllerAdvice

したがって、コントローラーが @Controllerアノテーション付きクラスの自動スキャンによって検出された@ControllerAdvice場合も機能するはずです (明示的なアノテーション式でクラスをスキャンする@Controller場合は、この Bean を個別に登録する必要がある場合があります)。

@ControllerAdvice
public class AppControllerAdvice{
        @ExceptionHandler(Throwable.class)
        ResponseEntity<String> customHandler(Exception ex) {
        return new ResponseEntity<String>(
                "Custom user message",
                HttpStatus.INTERNAL_SERVER_ERROR);

} 

テキストは返されたエンティティの一部であり、HTTP 理由フレーズではないことに注意してください。

于 2013-01-25T18:48:05.193 に答える
0

次のコードをフロント コントロールに追加します。

 @ExceptionHandler(Exception.class)
public @ResponseBody
MyErrorBean handleGeneralException(Exception e,
        HttpServletRequest request, HttpServletResponse response) {
    logger.info("Exception:" , e);
    response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    MyErrorBean errorBean = new MyErrorBean();
    errorBean.setStatus(MyConstants.ERROR_STATUS);
    return errorBean;

}`

JSON を使用しているので、これを JSON に変換するメッセージ コンバーターがコード内に構成されていると思います。ステータスを設定してBeanを送ることで解決できるようになります。

于 2013-01-23T20:47:00.887 に答える