web-dev-qa-db-ja.com

Resteasy 3.X PreProcessInterceptorの適切な交換は何ですか?

このチュートリアルで説明されているように、認証/承認メカニズムを使用してRESTサービスを構築しています: http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-チュートリアル/

基本的に、それは PreProcessInterceptor インターフェイスを使用してターゲットメソッドをスキャンし、そのメソッドにアクセスするために必要なロールを記述する注釈( javax.annotation.security パッケージから)を探します。ここでのオーセンティケーターはインターセプターであるため、必要に応じて401(無許可)を返し、ターゲットメソッドの呼び出しをキャンセルできます。

ここでの問題は、org.jboss.resteasy.spi.interception.PreProcessInterceptorインターフェースが現在のRestEasyバージョン(3.0.1)で非推奨になっていて、標準の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;
    }
}

SecurityInterceptor:

@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...
     }
}

この問題を解決するにはどうすればよいですか?

ありがとうございました。

29

AcceptedByMethodを実装することで以前は取得できたように)基礎となるJava.lang.reflect.Methodにアクセスする必要がある場合は、次の操作を実行できます。

ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) 
            requestContext.getProperty("org.jboss.resteasy.core.ResourceMethodInvoker");
Method method = methodInvoker.getMethod();
4
mtpettyp

また、基盤となるJava.lang.reflect.Methodにアクセスしたいと思っており、Resteasy 3.0.8でmtpettypの回答を試しましたが、getProperty呼び出しでnullを返していました。私はSpringとresteasy-springも使用していますが、これはまったく影響がないと思います。

私の状況に遭遇し、Post Matching ContainerRequestFilterを実装している場合(とにかく、一致するリソースメソッドを取得することを期待している場合は、そうする必要があります)、実際にContainerRequestContextをResteasyは試合後のシナリオに対応しています。 PostMatchContainerRequestContext には、ResourceMethodInvokerへの参照があります。

public void filter(ContainerRequestContext context) throws IOException {
    PostMatchContainerRequestContext pmContext = (PostMatchContainerRequestContext) context;

    Method method = pmContext.getResourceMethod().getMethod();

    /* rest of code here */
}
3
Rich