2017-02-03 12 views
1

ユーザクエリで、サービスにリクエストしたHTMLページ(ページ全体ではない)を受信したデータとともにレンダリングするWebページがありますAJAXSpringMVC:AJAXリクエストが失敗した場合の表示エラー表示

サービスを呼び出すための2つの方法があります:APIを通じて

  1. :my.website.com/api/person/John - >これは生のJSONを返す
  2. AJAX要求 :my.website.com/person#John - >内部的にこれはAPIを呼び出し、それが
をGESTデータをHTMLテーブルを埋め

起こっている事がinternal errorが発生した場合ということですS:

  1. APIを通じてを呼び出す:私のカスタムエラービューが表示されます - この望ましい動作
  2. AJAX要求で呼び出すwhenn:カスタムエラービューが表示されません - 代わりにされて起こることすべてHTMLテーブルが満たされない - 悪い動作。私はここでエラービューをしたい!

ジャバスクリプト

function displayPersonData(template, person) { 
     var url = "/api/person/" + person; 

     $.getJSON(url, function (data) { 
      renderHtmlTable(template, data); 
     }); 
} 

APIcontroller.java

@RequestMapping(value = "api/person/{person}", produces = "application/json", method = RequestMethod.GET) 
public @ResponseBody Person execute(@PathVariable(value = "person") String person) { 

     Random r = new Random(); 
     if(r.nextDouble() > 0.5) { 
      return proxy.getPersonData(person); // returns JSON 
     } else { 
      throw new MyCustomException("Test"); 
     }  
} 

エラーController.java

@ExceptionHandler(MyCustomException.class) 
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
public ModelAndView errorCallingService() { 
    LOG.error(MessageFormat.format("Call to %s failed.", PERSON_SERVICE)); // the logs gets triggered successfuly 

    return new ModelAndView("error_view.jsp"); // error_view doesnt get displayed 
} 

エラーコントローラがスローされたExceptionを正常にトリガし、ログを生成します。しかし何らかの理由でerror_view.jspが表示されません。 AJAXで呼び出されたときのみ。

解決策はありますか?エラーページにリダイレクトする必要はありません。my.website.com/exception_view

答えて

0

まず、ajaxリクエストではレスポンスがテキストとして表示されますが、リダイレクトしません。だからあなたは自分でビューレンダリングを扱うべきです。 しかし、現在、あなたが最も可能性が高いにも理由により、サーバからテキストrespnseを得ることはありません:あなたのエラービュー名が春より「error_view.jsp」であれば

  • は「/ API /人/ error_viewでビューを見つけようとします.jsp "となります。この場合、相対パスの作成を防ぐために戻り値を "/error_view.jsp"に変更してください。
  • もう1つの点は、エラーの場合は応答のコンテンツタイプがtext/htmlなので、$ .getJSONはおそらくクライアント側でエラーを生成するということです。代わりに$ .ajaxを使用してください。
  • 最後に、HttpStatus.INTERNAL_SERVER_ERRORが要求を失敗させ、エラーのために別のコールバックを登録する必要があります。

返されたhtmlを処理するには、ページ上の定義済みのプレースホルダに置くことができます。だからコードはjsのように見えるかもしれません:

function displayPersonData(template, person) { 
    var url = "/api/person/" + person; 

    $.ajax({ 
     url: url, 
     success: function (data) { 
     renderHtmlTable(template, data); 
     }, 
     error: function (xhr) { 
     $("#placeholder").html(xhr.responseText); 
     }, 
    ); 
} 
関連する問題