如何在不为每个资源定义默认处理程序的情况下覆盖所有 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
,情况就是这样:
/myservice/docs/helloworld
与我的 DocsResource 中定义的任何 @Path
都不匹配。它 return 是一个通用的 Jetty 404 页面(不是我想要的)
/myservice/doesntexist
return我自己的带有异常映射器的错误资源(这是我到处都想要的)
您需要做的是设置一个不同的错误处理程序。您在点击不存在的路径时看到的 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
干杯,
阿图尔
在我的 Dropwizard 项目中,我定义了一个通用 ExceptionMapper<WebApplicationException>
:
environment.jersey().register(new WebApplicationExceptionMapper());
...但这似乎没有捕捉到不匹配路径的任何 404 错误。
如果不为每个资源定义五个 defaultHandler()
方法,我如何捕捉所有 404 以便我可以 return 我自己的错误页面或一些 JSON?
所以,如果我有一个资源的服务,比如说,/docs
,情况就是这样:
/myservice/docs/helloworld
与我的 DocsResource 中定义的任何@Path
都不匹配。它 return 是一个通用的 Jetty 404 页面(不是我想要的)/myservice/doesntexist
return我自己的带有异常映射器的错误资源(这是我到处都想要的)
您需要做的是设置一个不同的错误处理程序。您在点击不存在的路径时看到的 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
干杯, 阿图尔