Это может быть спецификация контейнера c, но, по крайней мере, на Wildfly 18, я думаю, что могу делать то, что вы хотите Я использую фильтр сервлетов и чистый JAX-RS - ничего, что RestEasy указывает c (ни 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 {
}
}
, и catch
в фильтре не вызывается, пока этот код не запускается в Wildfly. Это имеет смысл, поскольку это часть JAX-RS.
Моя "услуга" - это просто:
@Path("/v1/exception")
public class ExceptionService {
@Produces({ MediaType.TEXT_PLAIN })
@GET
public Response getException() {
throw new InternalError("this is an internal error");
}
}