Resteasy 3.X PreProcessInterceptor的正确替代品是什么?


问题内容

我正在使用本教程中描述的身份验证/授权机制来构建Rest服务:http :
//howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-
authorization-tutorial/

基本上,它使用PreProcessInterceptor接口扫描目标方法中的注释(来自javax.annotation.security包),这些注释描述访问该方法所需的角色。由于此处的身份验证器是拦截器,它可以取消目标方法的调用,并在需要时返回401(未授权)。

这里的问题是在当前的RestEasy版本(3.0.1)中不推荐使用org.jboss.resteasy.spi.interception.PreProcessInterceptor接口,而在使用标准JAX-
RS接口实现相同行为时遇到问题。

我正在使用javax.ws.rs.ext.ReaderInterceptor接口来拦截呼叫。但是服务器以某种方式从未调用它:拦截器只是被忽略。

我以与以前的PreProcessInterceptor相同的方式注册拦截器/资源,并使用相同的@Provider和@ServerInterceptor批注:

ServerApplication:

public class ServerApplication extends javax.ws.rs.core.Application {

     private final HashSet<Object> singletons = new LinkedHashSet<Object>();

     public ServerApplication() {
         singletons.add(new SecurityInterceptor());
         singletons.add( ... ); //add each of my rest resources
     }

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>();
        return set;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

安全拦截器:

@Provider
@ServerInterceptor
public class SecurityInterceptor implements javax.ws.rs.ext.ReaderInterceptor {
     @Override
     public Object aroundReadFrom(ReaderInterceptorContext context){
            //code that is never called... so lonely here...
     }
}

关于如何解决此问题的任何见解?

谢谢。


问题答案:

RESTEasy 3.xx符合JAX-RS 2.0规范。

您尝试执行的操作可以(可能更好)完成:

@Provider
public class SecurityInterceptor 
      implements javax.ws.rs.container.ContainerRequestFilter {
     @Override
     public void filter(ContainerRequestContext requestContext){
       if (not_authenticated){ requestContext.abortWith(response)};
     }
}

因为ReaderInterceptor仅当底层MessageBodyReader.readFrom由标准JAX-
RS管道调用时才调用,而不是从应用程序代码中调用。

但是,未调用拦截器的原因可能是 @ServerInterceptor注释,它是RESTEasy扩展。

规范在§6.5.2中指出,拦截器是全局注册的,除非@Provider带有@NameBinding注释,否则我不知道是否RESTEasy可以处理@ServerInterceptor未明确注册的,如RestEASY拦截器未调用中所示。