[英]Method invocation failure JAX-RS / Wildfly / Java SDK13 with interceptor
[英]Intercept Jax-RS method invocation
我想拦截对用@HttpMethod
或它的一些子注释注释的方法的每个方法调用。
创建注释对我来说不方便,我把它放在了可以被 Jax-RS 调用的每个方法上,所以我转向WriterInterceptor
和ReaderInterceptor
。
但是,这些不是我要找的,因为我希望它拦截方法调用,而不是读取/写入过程。
过滤器不够好,因为我无法捕获该方法抛出的异常。
如果我不必用任意注释对每个方法进行注释,那么第一个解决方案(普通的 java-ee 拦截器)将是最好的选择。
我还有什么其他选择?
这可能是特定于容器的,但至少在 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 {
}
}
和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");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.