9

RestEasy2.3.​​4.Finalを利用してRESTAPIを作成しています。インターセプターがすべての要求をインターセプトし、PreProcessInterceptorが(すべての前に)最初に呼び出されることを知っています。特定のメソッドが呼び出されたときにこのインターセプターが呼び出されるようにするにはどうすればよいですか。

PreProcessInterceptorとAcceptedByMethodの両方を使用しようとしましたが、必要なパラメーターを読み取ることができませんでした。たとえば、Interceptorを実行する必要があるのは、このメソッドが呼び出されたときだけです。

@GET
@Produces("application/json;charset=UTF8")
@Interceptors(MyInterceptor.class)
public List<City> listByName(@QueryParam("name") String name) {...}

具体的には、インターセプターをすべてのメソッドで実行する必要があります。@QueryParam("name")

その署名に、私が名前をつかんで、すべての前に何かをすることができるように。

出来ますか?インターセプター内の「name」パラメーターをキャッチしようとしましたが、それができませんでした。

誰か助けてくれませんか?

4

2 に答える 2

8

RESTEasyのドキュメントAcceptedByMethodで説明されているように使用できます

PreProcessInterceptorとの両方を実装するクラスを作成しますAcceptedByMethod。-methodでは、acceptメソッドに。で注釈が付けられたパラメーターがあるかどうかを確認できます@QueryParam("name")。メソッドにそのアノテーションがある場合は、accept-methodからtrueを返します。

-methodでは、preProcessからクエリパラメータを取得できますrequest.getUri().getQueryParameters().getFirst("name")

編集:

次に例を示します。

public class InterceptorTest  {

    @Path("/")
    public static class MyService {

        @GET
        public String listByName(@QueryParam("name") String name){
            return "not-intercepted-" + name;
        }
    }

    public static class MyInterceptor implements PreProcessInterceptor, AcceptedByMethod {

        @Override
        public boolean accept(Class declaring, Method method) {
            for (Annotation[] annotations : method.getParameterAnnotations()) {
                for (Annotation annotation : annotations) {
                    if(annotation.annotationType() == QueryParam.class){
                        QueryParam queryParam = (QueryParam) annotation;
                        return queryParam.value().equals("name");
                    }
                }
            }
            return false;
        }

        @Override
        public ServerResponse preProcess(HttpRequest request, ResourceMethod method)
                throws Failure, WebApplicationException {

            String responseText = "intercepted-" + request.getUri().getQueryParameters().getFirst("name");
            return new ServerResponse(responseText, 200, new Headers<Object>());
        }
    }

    @Test
    public void test() throws Exception {
        Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();
        dispatcher.getProviderFactory().getServerPreProcessInterceptorRegistry().register(new MyInterceptor());
        dispatcher.getRegistry().addSingletonResource(new MyService());

        MockHttpRequest request = MockHttpRequest.get("/?name=xxx");
        MockHttpResponse response = new MockHttpResponse();

        dispatcher.invoke(request, response);

        assertEquals("intercepted-xxx", response.getContentAsString());
    }
}
于 2012-07-07T13:56:53.867 に答える
2

戻るreturn new ServerResponse(responseText, 200, new Headers<Object>());と、エンドポイントが失われます。nullそれでもメッセージを最終ポイントに配信したい場合は、戻る必要があります。

于 2012-12-10T15:08:36.193 に答える