当前位置: 首页 > 知识库问答 >
问题:

如何覆盖所有404页而不为每个资源定义默认处理程序?

文志学
2023-03-14

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

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

因此,如果我有一个带有一个资源的服务,例如/docs,则情况如下:

>

  • /myservice/docs/helloworld与我的docsresource中定义的任何@path不匹配。它返回一个通用的Jetty 404页面(不是我想要的)

    /myservice/doesntexist使用异常映射器返回我自己的错误资源(这是我在任何地方都想要的)

  • 共有1个答案

    陆翰学
    2023-03-14

    您需要做的是设置一个不同的错误处理程序。你看到的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;
        }
    

    (该类在AbstractServerFactory中)。

    对于测试,打开org.eclipse.jetty.server.handler.ErrorHandler并设置一个断点,然后尝试点击一个不存在的URL。这里就到此为止,你可以看到jetty是如何处理这种事情的。

    希望这能帮上忙。

    如果您需要覆盖默认DW功能的帮助,可以查看一篇类似的文章,我描述了如何覆盖记录器:

    Dropwizard不将自定义记录器记录到文件

    干杯,阿图尔

     类似资料:
    • 我无法覆盖REST API中默认的Spring Boot错误响应。我有以下代码 然后在我的REST api中抛出这个BusinessValidationException。这个处理程序被调用(我可以在调试器中看到它),但是我仍然得到缺省的Spring BootREST错误消息。是否有一种方法可以重写并仅将default用作后退?带有Groovy的Spring Boot版本1.3.2。最诚挚的问候

    • 有没有纯注解为Spring留档?我看到的90%的文档都是为xml实现编写的。 我正在尝试覆盖默认的JobLauncher以能够传递JobParameters,但我添加到下面代码中的任何JobLauncher函数都被忽略,而是运行默认的SimpleJobLauncher。 我想用4个不同的作业参数启动同一作业的4个并发实例。这些参数应该告诉读取器从哪个目录读取。 我可以使用@Value注释为目录传递

    • 我有一个RESTAPI,我不想强迫客户端发送请求参数。我有将近400个api方法,我不想将所有参数设置为“required=false” 我想覆盖Spring RequestParam的默认行为。我想将RequestParam接口的“required”属性的默认值设置为“false”。 有什么方法可以覆盖它吗?如果我不能或这不是最佳实践,有什么方法可以解决上述问题。

    • 我试图将Spring应用程序(大部分)转换为Spring Boot应用程序。在应用程序中,我有一个HTTP基本过滤器,收集用户名和密码,然后在DataSource实现中作为变量传递。 在这个数据源中,getConnection()方法是这样的: (由于StackOverflow格式问题,\n作为新行) 在Spring中,我可以毫无问题地实现@autowiledPrivate DataSource

    • 问题内容: 我已经创建了自己的主题作为单独的Maven项目,并且已正确加载了该主题。 现在,我想更改组件的大小。例如,一个。它有一个名为的类ui-orderlist-list,它primefaces.css使用200x200的固定尺寸定义。无论我在我的工作中做什么theme.css,它都会被此属性覆盖,并且我无法将内容 扩大。 对于其他组件,我可能只想覆盖一个组件实例,而不是全部。 谁能告诉我该怎

    • 我不认为这篇文章我如何覆盖laravel资源路由默认方法?解决了我的问题。 正常的资源路由是“索引”显示所有项目。我想做的是让“索引”显示一个特定ID的所有相关项目。 因此,当我从列表中选择一个教室时,我需要调用的索引操作,以显示该特定教室的所有人员,就像它的索引函数一样。 所以我替换了默认的资源路由 与 所以在我的控制器中,我有这样的内容: 在我的教室里,在一个特定的教室id上,我有这个 就我所