このチュートリアルで説明されているように、認証/承認メカニズムを使用して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...
}
}
この問題を解決するにはどうすればよいですか?
ありがとうございました。
(AcceptedByMethod
を実装することで以前は取得できたように)基礎となるJava.lang.reflect.Method
にアクセスする必要がある場合は、次の操作を実行できます。
ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker)
requestContext.getProperty("org.jboss.resteasy.core.ResourceMethodInvoker");
Method method = methodInvoker.getMethod();
また、基盤となる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 */
}