Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拦截Jax-RS方法调用_Java_Jakarta Ee_Jax Rs_Resteasy - Fatal编程技术网

Java 拦截Jax-RS方法调用

Java 拦截Jax-RS方法调用,java,jakarta-ee,jax-rs,resteasy,Java,Jakarta Ee,Jax Rs,Resteasy,我想截取用@HttpMethod或其子注释注释的方法的每个方法调用 创建注释对我来说并不方便,我将注释放在Jax RS可以调用的每个方法上,因此我转向WriterInterceptor和ReaderInterceptor 然而,这些不是我想要的,因为我希望它拦截方法调用,而不是读/写过程 过滤器不够好,因为我无法捕获该方法引发的异常 如果我不必用任意注释对每个方法进行注释,那么第一个解决方案(普通JavaEE拦截器)将是最好的选择 我还有什么其他选择?这可能是特定于容器的,但至少在Wildfly

我想截取用
@HttpMethod
或其子注释注释的方法的每个方法调用

创建注释对我来说并不方便,我将注释放在Jax RS可以调用的每个方法上,因此我转向
WriterInterceptor
ReaderInterceptor

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

过滤器不够好,因为我无法捕获该方法引发的异常

如果我不必用任意注释对每个方法进行注释,那么第一个解决方案(普通JavaEE拦截器)将是最好的选择


我还有什么其他选择?

这可能是特定于容器的,但至少在Wildfly 18上,我想我可以做你想做的事情。我使用的是一个servlet过滤器和纯JAX-RS——没有RestEasy特有的(也没有Spring)。我的
应用程序
代码执行以下操作:

@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
调用进行了try/catch。这是您可以捕获任何异常的地方。有趣的是,我还有一个
ContainerRequestFilter

@Provider
@Priority(Priorities.AUTHENTICATION)
@PreMatching
public class AuthContainerRequestFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException  {
    }
}
过滤器中的
catch
在该代码在Wildfly中运行之前不会被调用。这是有道理的,因为这是JAX-RS部分

我的“服务”只是:


我没有想到servlet过滤器,这听起来是个好主意,谢谢,我一定会尝试的
@Path("/v1/exception")
public class ExceptionService {
    @Produces({ MediaType.TEXT_PLAIN })
    @GET
    public Response getException() {
        throw new InternalError("this is an internal error");
    }
}