Java Filter/ContainerRequestContext异步处理(Jeresy/JAX-RS)

Java Filter/ContainerRequestContext异步处理(Jeresy/JAX-RS),java,jakarta-ee,asynchronous,jax-rs,jersey-2.0,Java,Jakarta Ee,Asynchronous,Jax Rs,Jersey 2.0,我目前遇到一个问题,在异步请求完成之前,我的HTTP请求被发送到“处理阶段”,该异步请求认为身份验证是否有效 以下是导致问题的过滤器示例: @Provider public class AuthenticationFilter implements ContainerRequestFilter { private static final Response ACCESS_DENIED = Response.status(Response.Status.UNAUTHORIZED).bui

我目前遇到一个问题,在异步请求完成之前,我的HTTP请求被发送到“处理阶段”,该异步请求认为身份验证是否有效

以下是导致问题的过滤器示例:

@Provider
public class AuthenticationFilter implements ContainerRequestFilter {

    private static final Response ACCESS_DENIED = Response.status(Response.Status.UNAUTHORIZED).build();
    private static final Response INTERNAL_SERVER_ERROR = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();

    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void filter(final ContainerRequestContext context) throws IOException {
        System.out.println("Filter called");
        Method method = resourceInfo.getResourceMethod();

        if(method.isAnnotationPresent(NoAuthorizationRequired.class)) {
            return;
        }

        if(method.isAnnotationPresent(AuthorizationRequired.class)) {

            AuthorizationRequest request = (new AuthorizationRequest(false) {
                @Override
                public void onCompleted(ParallelResult superResult) {
                    AuthorizationResult result = (AuthorizationResult)superResult;
                    if(result.successful()) {
                        System.out.println("Authentication completed -- Process resource");
                    } else {
                        context.abortWith(ACCESS_DENIED);
                    }
                }
            });

            request.setTask(new AuthorizationTask(request));

            Worker.work(request);

        } else {
            System.err.println("[SEVERE] IMPLEMENTATION FAULT. Authorization annotation not found for method: " + method.getName());
            context.abortWith(INTERNAL_SERVER_ERROR);
        }

    }

}

如何使请求在异步请求完成之前不会进入“处理阶段”。(数据库)

也许?@peeskillet-任何会导致线程阻塞的事情都违背了异步处理的全部目的。如果要使用CountDownLatch,我还可以在主线程上处理查询。注意:没有逻辑来解决这个问题,如果该方法在没有调用“abort”的情况下完成执行,则进入“处理阶段”。如果您需要等待异步处理完成,就过滤器->资源处理而言,这与同步处理不是很一样吗?如果我理解正确的话,那不是你的意思吗。或者我不明白你的问题correctly@peeskillet-区别在于,我正在寻找一种将上下文传递给处理线程的方法,而不是等待网络线程等待处理线程完成工作。整个API都是异步友好的,直到涉及到过滤器,而过滤器似乎没有任何异步实现。一个长时间的数据库调用可能会导致许多REST请求超时。啊,我明白你的意思。也许?@peeskillet-任何会导致线程阻塞的事情都违背了异步处理的全部目的。如果要使用CountDownLatch,我还可以在主线程上处理查询。注意:没有逻辑来解决这个问题,如果该方法在没有调用“abort”的情况下完成执行,则进入“处理阶段”。如果您需要等待异步处理完成,就过滤器->资源处理而言,这与同步处理不是很一样吗?如果我理解正确的话,那不是你的意思吗。或者我不明白你的问题correctly@peeskillet-区别在于,我正在寻找一种将上下文传递给处理线程的方法,而不是等待网络线程等待处理线程完成工作。整个API都是异步友好的,直到涉及到过滤器,而过滤器似乎没有任何异步实现。一个长时间的数据库调用可能会导致许多REST请求超时。啊,我明白你的意思。