2012-03-12 21 views
7

Strutsで記述されたJavaバックエンドを呼び出すAJAX対応JavaScriptフロントエンドで作業しています。私の問題は、バックエンドが例外をスローすると、クライアントは期待どおりに "500 Internal Server Error"ではなく "200 OK" HTTP応答コードを見ていることです。例外がスローされたときにStrutsが500内部サーバーエラーを送信する

サードパーティのクライアントJavaScriptライブラリが、HTTPステータスコードに依存しているため、AJAX呼び出しに問題があるかどうかを判断することができます。通常はJSONとなるものを解析しようとすると、コードが爆発するまでエラーは検出されません。

これらのエラーを正常に処理するために、クライアントJSライブラリをハッキングしないようにしたいと思います。それでは、バックエンドに未処理の例外があった場合、Strutsに500のステータスコードを与える方法を教えてください。これはStrutsのデフォルトの動作ではないでしょうか?

編集:この場合、クライアント側のコードは無関係です。私は未処理の例外が発生したときに適切なステータスコードを送信するようにサーバーを修正する必要があります。ありがとう!

答えて

3

です。私はそれが最高か最も簡単かどうか分からないが、それは働く。私は、次のStrutsにException Configuration guideを見つけて、コメントを追加私の<package>struts.xml内側:

<global-results> 
    <result name="exception">/exception.jsp</result> 
</global-results> 

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="exception" /> 
</global-exception-mappings> 

これは/exception.jspにリダイレクトされるすべての未処理の例外が発生します。そして、ここにJSPの内容は次のとおりです。

<%@ taglib prefix="s" uri="/struts-tags" %> 
<%@ page contentType="application/json; charset=UTF-8" %> 
<% response.setStatus(500); %> 
{"success": false,"errors": "<s:property value="%{exception.message}"/>"} 

あなたは私が手動でこれは私に新しい問題を与えた500

に応答コードを設定する第三行に注意しましょう:例外は、これ以上記録されていませんでした。前述のStrutsのガイドで示唆したように、私もstruts.xmlの私<package>に以下を追加することで、これを解決:

<interceptors> 
    <interceptor-stack name="appDefaultStack"> 
     <interceptor-ref name="defaultStack"> 
      <param name="exception.logEnabled">true</param> 
      <param name="exception.logLevel">ERROR</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</interceptors> 

<default-interceptor-ref name="appDefaultStack" /> 

のStruts:このような単純なと明白な機能ではありませんデフォルトを作るための-1、および他の-1ソリューションをあまりにも鈍くするためです。

-1

あなたが使用しているJSライブラリについては言及していませんでした。ドキュメントを慎重に読むことをお勧めします。何らかのコールバックメソッドがある場合は、responseCode以外のresponseTextが必要です。サーバー側で検証例外が発生するたびに、エラーメッセージも渡します。あなたがAJAXを使用しているので、いくつかの例外を投げることに頼らないでください。 responseTextを追跡して、「この理由で検証に失敗しました。もう一度やり直してください」などのメッセージを表示することができます。同意する?それ以外の場合は

応答がコミットされる前WebApplicationExceptionを投げる:

throw new javax.ws.rs.WebApplicationException(); // or by any other constructor 

をここに私はそれを行うための一つの方法を考え出しjar

+0

クライアント側ライブラリはExtJSですが、それは問題ではありません。サーバーが問題を抱えています。サーバー側に未処理の例外があると、StrutsはHTMLエラーレポートと "200 OK"ステータスコードを送信します。これが私が修正しようとしているものです。私が扱うことができるHTMLですが、Strutsはコード200ではなく、エラーが発生したときにコード500を送信できるようにしなければなりません。ありがとう! – curtisdf

+0

'WebApplicationException()によってHTTP 500エラーコードが発生します。あなたはこれを投げてみましたか? – tusar

+0

サーバー側では、どこにでもtry/catchブロックを挿入する必要はありません。 Strutsに「Right Thing(tm)を実行して、これらのばかげた問題報告を送信するたびに500応答コードを渡すように指示する何らかの設定が必要です」 – curtisdf

0

500内部サーバーエラーは、サーバー側のエラーです。これは、コンピュータまたはインターネット接続ではなく、Webサイトのサーバーに問題がある可能性が高いことを意味します。

これはクライアント側で処理することに注意しています。これは、要求を処理する際に設定されたWebサーバー(HTTPサーバー)上にあります。

+0

-1。私は私の質問を書いたところで、クライアントとサーバーの相互作用の性質だけでなく、500内部サーバーエラーが何であるかをすでに理解していることは明らかです。私はStrutsを(私のサーバー上で)私が望むように動作させる方法に関する情報を探していました。 – curtisdf

2

更新:私は(httpheaderタグがありませんでした)<global-results>セクション

を修正しました、私はより良いyour solutionを好きですが、ここにあなたが/ wを台無しにしたくなかった場合は、あなたがそれを行うことができ、別の方法がありますjspに応答ヘッダーを設定します。 struts.xmlで

  1. 、struts.xmlでは「例外」
  2. という名前の結果に「のjava.lang.Exception」からグローバル例外マッピングを作成し、に「例外」をマップするグローバルな結果を作成しますhttpヘッダー結果の値が500である。
  3. web.xmlには、エラーコード500をエラーページの場所にマップするエラーページエントリを作成します。
  4. だから、

、struts.xml用:

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="exception" /> 
</global-exception-mappings> 

<global-results> 
    <result name="exception" type="httpheader"> 
     <param name="error">500</param> 
    </result> 
</global-results> 

そして、web.xmlの

<error-page> 
    <error-code>500</error-code> 
    <location>/exception.jsp</location> 
</error-page> 

これは、いくつかの大きな欠点が動作しますが、持っています。サーブレットコンテナはエラーページ(strutsではなく)をレンダリングしているため、元のエラーメッセージやストラットのvalueStackにアクセスすることはありません。ただし、例外ログは有効です(有効にしている場合)。

私はあまりにも、ストラットがこれを非常に難しくしていることに困惑しています。他のすべてのフレームワークでは、エラーページを返すというコンセプトを扱いました。エラーコードは実装するのがかなり簡単です。

関連する問題