1

我是 quarkus/resteasy 的新手,但是当我在本地以开发模式运行我的 quarkus 应用程序时,未处理的异常包括有用的详细信息和堆栈跟踪,如下所示:

{ 
  "details": "Error handling b4f19eef-3634-49f4-865e-55ee75ee3f82-1, org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException: bla bla bla...",
  "stack": "org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException: Cannot invoke ... 
            ... mile long stack trace here ..."
}

但是,从服务器运行时,我会收到这些精简的错误消息,如下所示:

{
  "details": "Error id e7bdec12-e36c-40fe-a7c6-096ec8eb62ca-4",
  "stack": ""
}

如何获取异常消息,就像我从服务器本地获取的一样?是什么导致了这种变化?我无法找到任何application.properties可能与此相关的内容 ( https://quarkus.io/guides/all-config ),而且我不知道还能去哪里找。

4

2 回答 2

1

正如 Geoand 所提到的,您真的不想在本地开发环境之外的任何其他环境上执行此操作。然而 JaxRS(由 Resteasy 实现)让您完全控制,您可以创建自定义 JaxRS 异常映射器,将未处理的异常转换为您想要的任何 HTTP 响应,包括堆栈跟踪的所有血腥细节。例子:

@Provider
@Priority(10000)
//the more generic the mapper, the lower its prio should be(the lower the number the higher the pri), so you can override it with more specific mappers
public class ChattyExceptionMapper implements ExceptionMapper<Exception> {

    @Context
    HttpHeaders headers;
    //you can inject all JaxRS ctx data using @Context, see spec
    @Context
    ResourceInfo resourceInfo;

    @Override
    public Response toResponse(Exception e) {
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        return Response
                .serverError()
                .entity(Map.of(
                        "requestHeaders", headers.getRequestHeaders(),
                        "endpointClass", resourceInfo.getResourceClass(),
                        "endpointMethod", resourceInfo.getResourceMethod().getName(),
                        "stacktrace", sw.toString()))
                .build();
    }
}

我在 prod 中更有用的方法可能是,您将后台的堆栈跟踪/错误信息报告给某个错误报告系统(例如 Sentry,...),为该事件分配一些 ID 并在错误响应中返回事件 ID (通过您的自定义异常映射器)。这样,您可以在收到客户/客户的投诉之前主动监控错误,如果这样做,您可以将 eventId 链接到错误报告系统中的所有详细数据。

于 2021-05-14T11:41:19.313 回答
0

Quarkus 是故意这样做的。

在开发模式下,当您开发应用程序时,您希望获得所有可以获得的信息。但是在生产模式下,您不希望将应用程序的内部信息泄露给调用者。所以在这种情况下,您只能在服务器日志上看到堆栈跟踪

于 2021-05-13T05:54:31.207 回答