Play Framework 2.7 - 为什么在处理错误时过滤器不起作用

Jea*_*ôté 5 java error-handling filter playframework

我正在尝试从 Play 2.6 迁移到 Play 2.7。

在我的代码中,我有一个自定义过滤器,它将特定标题添加到 CORS 的结果中。这里没什么特别的。

在 Play 2.7 之前,我通过 Action 组合添加了标题,但由于我们不再能够轻松访问结果(只有请求),我发现使用过滤器会更容易(并且我希望在所有调用中都使用它,所以这说得通)。

我的问题是在 Play 2.7 中,当我的代码中出现异常时,我的自定义过滤器会被调用,但不会被应用。它适用于每个不在 ErrorHandler 中的调用。这使得前端无法使用结果,因为它不包含所需的标头。

所以我的问题是:即使出现错误/异常,我们如何确保调用和应用过滤器?

这是过滤器:

@Singleton
public class AccessHeaderFilter extends EssentialFilter {
    private final Executor exec;
    private final Config configuration;

    @Inject
    public AccessHeaderFilter(Executor exec, Config configuration) {
        this.exec = exec;
        this.configuration = configuration;
    }

    @Override
    public EssentialAction apply(EssentialAction next) {
        return EssentialAction.of(request ->
                next.apply(request)
                        .map(result ->
                            result.withHeader(Http.HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, configuration.getString("front-end.url"))
                            .withHeader(Http.HeaderNames.ACCESS_CONTROL_REQUEST_METHOD, "GET, POST, PUT, DELETE, OPTIONS")
                            .withHeader(Http.HeaderNames.ACCESS_CONTROL_ALLOW_HEADERS, "Cache-Control, X-Requested-With, Accept, Content-Type")
                            .withHeader(Http.HeaderNames.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")
                            .withHeader(Http.HeaderNames.CACHE_CONTROL, "public"),
                        exec)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

真实场景:用户尝试创建一个名称已经被占用的资源。我抛出一个 FeedbackException 它将返回一个带有元异常详细信息的 http 200,前端使用它来显示一个有趣的弹出窗口。在 Play 2.7 之前,响应将包含标头。现在没有了。

知道如何确保即使在触发错误处理程序时也应用过滤器吗?