如何在不为每个资源定义默认处理程序的情况下覆盖所有 404 页面?

How do I override all 404 pages without defining default handlers for every resource?

在我的 Dropwizard 项目中,我定义了一个通用 ExceptionMapper<WebApplicationException>:

environment.jersey().register(new WebApplicationExceptionMapper());

...但这似乎没有捕捉到不匹配路径的任何 404 错误。

如果不为每个资源定义五个 defaultHandler() 方法,我如何捕捉所有 404 以便我可以 return 我自己的错误页面或一些 JSON?

所以,如果我有一个资源的服务,比如说,/docs,情况就是这样:

您需要做的是设置一个不同的错误处理程序。您在点击不存在的路径时看到的 404 不是由球衣处理的。 Jersey 为资源映射异常,但实际上您从一开始就没有访问资源。这是您需要定义错误处理程序的地方:

在 DefaultServerFactory 中,您需要覆盖:

protected Server buildServer(LifecycleEnvironment lifecycle,
                                 ThreadPool threadPool) {
        final Server server = new Server(threadPool);
        server.addLifeCycleListener(buildSetUIDListener());
        lifecycle.attach(server);
        final ErrorHandler errorHandler = new ErrorHandler();
        errorHandler.setServer(server);
        errorHandler.setShowStacks(false);
        server.addBean(errorHandler);
        server.setStopAtShutdown(true);
        server.setStopTimeout(shutdownGracePeriod.toMilliseconds());
        return server;
    }

(这个 class 在 AbstractServerFactory 中)。

然后您可以实现自己的 ErrorHandler 并让它执行您希望它执行的任何操作。

为了测试,打开 org.eclipse.jetty.server.handler.ErrorHandler 并设置一个断点,然后尝试命中一个不存在的 URL。它会停在那里,你可以看到码头如何处理这种事情。

希望对您有所帮助。

如果您需要帮助覆盖默认的 DW 功能,您可以查看类似的 post,我在其中描述了如何覆盖记录器:

Dropwizard doesn't log custom loggers to file

干杯, 阿图尔