8

Strutsで記述されたJavaバックエンドを呼び出すAJAX対応のJavaScriptフロントエンドに取り組んでいます。私の問題は、バックエンドが例外をスローした場合でも、クライアントには、予想される「500InternalServerError」ではなく「200OK」HTTP応答コードが表示されることです。

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

これらのエラーを適切に処理するために、クライアントのJSライブラリをハッキングすることは絶対に避けたいと思います。では、バックエンドで未処理の例外が発生した場合に、Strutsに500ステータスコードを表示させるにはどうすればよいですか?これはStrutsのデフォルトの動作ではありませんか?

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

4

4 に答える 4

3

私はそれを行う1つの方法を考え出しました。それが最良か最も簡単かはわかりませんが、機能します。Struts Exception Configurationガイド<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}"/>"}

3行目に、応答コードを手動で500に設定したことがわかります。

これは私に新しい問題を与えました:例外はもうログに記録されていませんでした。前述のStrutsガイドで提案されているように、私はこれを解決するために、次のものも追加し<package>ましstruts.xmlた。

<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は、ソリューションを非常に鈍感にするためのものです。

于 2012-03-15T16:26:57.987 に答える
3

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

私はあなたのソリューションの方が好きですが、jspで応答ヘッダーを設定することで混乱したくない場合は、別の方法でそれを行うことができます。

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

したがって、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ではなく)エラーページをレンダリングしているため、元のエラーメッセージまたはstrutsvalueStackにアクセスできません。ただし、例外ログは引き続き機能します(有効にしている場合)。

余談ですが、ストラットがこれを非常に難しくしているのは私も困惑しています。他のすべてのフレームワークでは、エラーページを返すという概念を扱ってきましたが、エラーコードの実装は非常に簡単です。

于 2013-03-25T20:43:19.717 に答える
0

500 Internal Server Errorはサーバー側のエラーです。つまり、問題はおそらくコンピューターやインターネット接続にあるのではなく、Webサイトのサーバーにあるということです。

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

于 2012-12-18T09:47:50.047 に答える
-1

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

それ以外の場合は、応答がコミットされる前にWebApplicationExceptionをスローします。

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

これが瓶です

于 2012-03-14T05:34:49.343 に答える