繁体   English   中英

拦截 Jax-RS 方法调用

[英]Intercept Jax-RS method invocation

我想拦截对用@HttpMethod或它的一些子注释注释的方法的每个方法调用。

创建注释对我来说不方便,我把它放在了可以被 Jax-RS 调用的每个方法上,所以我转向WriterInterceptorReaderInterceptor

但是,这些不是我要找的,因为我希望它拦截方法调用,而不是读取/写入过程。

过滤器不够好,因为我无法捕获该方法抛出的异常。

如果我不必用任意注释对每个方法进行注释,那么第一个解决方案(普通的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM