这可能是特定于容器的,但至少在 Wildfly 18 上,我想我可以做你想做的事。我正在使用 servlet 过滤器和纯 JAX-RS - 没有特定于 RestEasy(也不是 Spring)。我的Application 代码可以:
@ApplicationPath("/rest")
public class RestApplicationConfig extends Application {
// intentionally empty
}
我的过滤器是:
@WebFilter(urlPatterns = "/rest/*")
public class FilterTest implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
try {
filterChain.doFilter(servletRequest, servletResponse);
}
catch( Throwable t ) {
// handle exception
}
}
}
请注意,我对 doFilter 调用进行了尝试/捕捉。这是您可以捕获任何异常的地方。一个有趣的补充是我还有一个ContainerRequestFilter:
@Provider
@Priority(Priorities.AUTHENTICATION)
@PreMatching
public class AuthContainerRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
}
}
并且在此代码在 Wildfly 中运行之前,不会调用过滤器中的 catch。这是有道理的,因为这是 JAX-RS 部分。
我的“服务”只是:
@Path("/v1/exception")
public class ExceptionService {
@Produces({ MediaType.TEXT_PLAIN })
@GET
public Response getException() {
throw new InternalError("this is an internal error");
}
}