gpt4 book ai didi

java - 如何覆盖 Dropwizard 的默认资源异常处理?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:56 25 4
gpt4 key购买 nike

假设我在 Dropwizard 中有一个端点,比方说

@GET
public Response foo() { throw new NullPointerException(); }

当我到达这个端点时,它会记录异常和所有内容,这太棒了!我喜欢它。我不太喜欢的是它向用户返回一个大的状态对象,其中包含 status: ERROR(这很好)以及一个巨大的堆栈跟踪,我对此不太感兴趣。

显然,我最好自己捕获并处理异常,但它们有时会被漏掉。每次都围绕整个资源编写一个 try catch block 很好,但是 (a) 它很麻烦,并且 (b) 我总是更喜欢自动化解决方案而不是“你必须记住”的解决方案。

所以我想要的是执行以下操作的东西:

  1. 记录堆栈跟踪(我使用 slf4j,但我认为它适用于任何情况)
  2. 返回一个通用错误响应,它不会暴露有关我的服务器的潜在特权信息!

我觉得一定有一种内置的方法可以做到这一点——它已经以一种相对不错的方式处理异常——但搜索文档没有找到任何结果。有好的解决方案吗?

最佳答案

正如 reek 在评论中提到的,答案是 ExceptionMapper。你需要这样的类(class):

@Provider
public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {
@Override
public Response toResponse(RuntimeException runtime) {
// ...
}
}

您可以在 toResponse 方法中执行任何您喜欢的日志记录或其他操作,返回值是实际发送给请求者的值。这样您就拥有了完全的控制权,并且应该设置合理的默认值——记住这是针对漏掉的错误,而不是针对您实际期望看到的错误!这也是根据您收到的异常类型设置不同行为的好时机。

要真正让它做任何事情,只需在主 dropwizard 应用程序的 run 方法中插入以下行(或类似行):

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

其中 environment 是应用程序的 run 方法的 Environment 参数。现在,当你在某处有一个未捕获的 RuntimeException 时,这将触发,而不是 dropwizard 之前正在做的任何事情。

注意:这仍然不是不仔细捕获和处理异常的借口!

关于java - 如何覆盖 Dropwizard 的默认资源异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41192968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com