6

短くしてみます。これが、Spark フィルターを理解しようとしているときに発生した問題です。私は単純なアプリを作成しようとしていますが、クライアントが 404 または 500 などの http エラーを表示しようとするたびにエラー レポートを作成する必要があります。私のアプリは次のようになります。

import static spark.Spark.*;

public class MyApp {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "{\"status\":\"OK\"}");

        after((request, response) -> {
            if (response.raw().getStatus() == 404) {
                // here run the code that will report the error e.g. 
                System.out.println("An error has occurred!!");
            }
        });
    }
}

何らかの理由で、responseパラメーターが 404 に設定されているかどうかを確認しているときに、パラメーターのステータス属性が 0 に設定されて"after" filters are evaluated after each request and can read the request and read/modify the responseいます。

基本的に、フィルターを使用して http エラーを傍受しようとしていafterますが、応答を確認しようとすると、期待どおりの結果が得られません。

同じことを別の方法で行う方法や、これを機能させる方法を知っている人はいますか?

ありがとう。

4

2 に答える 2

6

ワイルドカードルートを使用してこれを解決しました。メソッドを呼び出す代わりにafter、"*" ルートをバインドする HTTP メソッドごとにルートを追加しました。

Mainルートが解決されない場合、これらのルートが常にトリガーされるように、メソッドの最後にそれらを配置することが重要です。

次に例を示します。

import static spark.Spark.*;

public class MyApp {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "{\"status\":\"OK\"}");

        get("*", (request, response) -> {
            System.out.println("404 not found!!");
            // email me the request details ...    
        );
    }
}
于 2014-12-01T20:30:51.437 に答える
2

探しているものを達成するための好ましい方法は、次のようになります。

get("/hello", (request, response) -> {
    // look up your resource using resourceId in request/path/query
    // oh dear, resource not found
    throw new NotFoundException(resourceId);
});

exception(NotFoundException.class, (e, request, response) -> {
    response.status(404);
    response.body(String.format("Resource {%s} not found", e.getResourceId()));
    // doReporting here.
});

public class NotFoundException extends Exception {
    private final String resourceId;
    public NotFoundException(String resourceId) {
        this.resourceId = resourceId;
    }

    public String getResourceId() {
        return resourceId;
    }
}
于 2015-10-19T06:42:41.573 に答える