6

我会尽量保持简短。这是我在尝试理解 Spark 过滤器时遇到的问题。我正在尝试创建一个简单的应用程序,它应该做的一件事是在每次客户端即将看到 http 错误(例如 404 或 500)时创建一个错误报告。这是我的应用程序的样子:

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这样说的,我应该能够以某种方式做到这一点(除非文档是错误的)。

基本上,我正在尝试使用after过滤器拦截 http 错误,但是当我尝试检查响应时,我没有得到我期望的结果。

有没有人知道做同样事情的不同方式或如何使这项工作?

谢谢。

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 回答