【问题标题】:Intercept Jax-RS method invocation拦截 Jax-RS 方法调用
【发布时间】:2020-03-20 23:42:33
【问题描述】:

我想拦截对带有@HttpMethod 或其某些子注释的方法的每个方法调用。

创建注解对我来说并不方便,我在每个可以被 Jax-RS 调用的方法上都添加了注解,所以我求助于 WriterInterceptorReaderInterceptor

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

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

如果我不必使用任意注释来注释每个方法,那么第一个解决方案(普通的 java-ee 拦截器)将是最佳选择。

我还有什么其他选择?

【问题讨论】:

    标签: java jakarta-ee jax-rs resteasy


    【解决方案1】:

    这可能是特定于容器的,但至少在 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");
        }
    }
    

    【讨论】:

    • 没有想到servlet过滤器,这听起来是个好主意,谢谢,我一定会试试的
    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 2011-08-12
    • 2016-12-08
    • 2014-03-25
    • 1970-01-01
    • 2014-10-11
    • 2016-03-01
    相关资源
    最近更新 更多