1

だから私は取り組んでいるStruts2アプリケーションを持っています。フロント ページには、アプリケーションがスローする例外を表示するセクションがあります。カスタムインターセプターを追加するまで、これはうまくいきました。

これが私のインターセプターコードです:

public String intercept(ActionInvocation actionInvocation) throws Exception {

    String result = actionInvocation.invoke();

    return result;
}

これは、例外が生成される Action クラスのコードです。AuthService.Authorize() が呼び出される場所で発生します。

if(AuthService.Authorize(username, password)) {
        if(AuthService.AdminAuthorized()) {
            return "admin";
        }
        return SUCCESS;
    }

これは AuthService.Authorize() の内部にあり、acc にアクセスすると null ポイント例外がスローされます。

try {
            acc = profileRepository.WhereSingle("Username", "=", username);
        } catch (Exception e) {
            return false;
        }

        if (acc.Password.equals(password)) {

ただし、ページがロードされたとき。これは入力されていません:

<s:property value="%{exception.message}"/>

私はそれをテストしましたが、単純に Action クラスから例外をスローした場合に機能します。私はredirectActionなどを呼び出していません

これは、他のすべてのパッケージが拡張するデフォルトのパッケージ定義の先頭です

<package name="default" namespace="/" extends="struts-default">

    <!-- Interceptors -->
    <interceptors>
        <interceptor name="conversation" class="global.ConversationInterceptor"/>
        <interceptor-stack name="dils-stack">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="conversation"/>                
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="dils-stack"/>

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

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

1 に答える 1

1

そのアクションに対してインターセプター スタックはどのように定義されていますか? ExceptionMappingInterceptorは、スタック内で最初に定義する必要があります。struts.xml からインターセプター スタック構成を投稿できますか? カスタム インターセプターが干渉しないようにする必要があります (何もしません)。

更新しました:

この問題は再現できましたが、カスタム インターセプターの有無にかかわらず発生します。

NullPointerExceptionその理由は、 (あなたの場合のように) 自動的にスローされる s に対して設定されていない例外メッセージを具体的に探しているためです。これは、代わりに次のようなスタック トレースを表示することで確認できます。%{exceptionStack}

%{exception.message}は null であるため、NullPointerException何も表示されません。代わりに、メッセージ (例: ) を付けて例外をスローすると、メッセージthrow new RuntimeException("OMG!");が表示されます。

また、struts.xml で特定性の低いマッピングを行う前に、より具体的な例外マッピングを指定する必要があることに注意してください。NullPointerExceptionは より具体的であるためException、最初にリストする必要があります。これらは同じものにマップされるため、これはあなたの例では実際には問題にならないことに注意してください。NPE は 2 番目のエントリではなく、最初のエントリにマップされることに注意してください。

于 2010-11-16T05:00:53.813 に答える