gpt4 book ai didi

java - Jersey ......如何记录所有异常,但仍然调用 ExceptionMappers

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:58:49 26 4
gpt4 key购买 nike

我有点束手无策......想要我的蛋糕并把它也吃掉。

我想记录我的应用程序抛出的所有 异常。因此,如果有人点击了错误的 URL,我想将堆栈跟踪记录到 SLF4J。

所以您可能在想,‘嘿,这很简单,只需实现一个异常映射器并记录异常即可。’所以我做到了:

public class RestExceptionMapper implements ExceptionMapper<java.lang.Exception> {
private static final Logger log = LoggerFactory.getLogger(RestExceptionMapper.class);

/**
* {@inheritDoc}
*/
@Override
public Response toResponse(Exception exception) {
log.error("toResponse() caught exception", exception);
return null;
}
}

如果您这样做,当有人输入错误的 URL 时,他们将收到 500 错误,而不是 404 错误。有人会猜测返回 null 会将异常传播到链处理程序中,但 Jersey 不会这样做。它实际上提供了很少的信息,为什么它会选择一个处理程序而不是另一个处理程序......

有没有人遇到过这个问题,你是怎么解决的?

最佳答案

您可以使用 RequestEventListener在不干扰任何现有处理的情况下监听异常事件并记录可抛出的事件。请注意,这意味着首先注册一个 ApplicationEventListener,然后返回一个 RequestEventListener 的实例。以下内容均在单个类中实现:

@Provider
public class ExceptionLogger implements ApplicationEventListener, RequestEventListener {

private static final Logger log = LoggerFactory.getLogger(RequestExceptionLogger.class);

@Override
public void onEvent(final ApplicationEvent applicationEvent) {
}

@Override
public RequestEventListener onRequest(final RequestEvent requestEvent) {
return this;
}

@Override
public void onEvent(RequestEvent paramRequestEvent) {
if(paramRequestEvent.getType() == Type.ON_EXCEPTION) {
log.error("", paramRequestEvent.getException());
}
}
}

关于java - Jersey ......如何记录所有异常,但仍然调用 ExceptionMappers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048212/

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