Java gRPC получает имя службы от ServerInterceptor

Я использую gRPC, и мне нужно получить имя службы запроса от ServerInterceptor, но, похоже, это невозможно.

В основном из реализации ServerInterceptor мне нужно знать имя ServiceGrpc (в виде строки), которое будет вызываться.

public class PermissionInterceptor implements ServerInterceptor {

        @Override
        public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
                ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> handler
        ) {
            // here I need the name of RPC service that has been requested

            return handler.startCall(serverCall, metadata);
        }
}

Обратите внимание, что я пытался использовать serverCall.getMethodDescriptor(), но он возвращает имя службы proto, а не настоящее имя службы ( Ява) сервис.

Он возвращает:

co.test.domain.transaction.TransactionService

Но мне нужно это:

co.test.domain.transaction.TransactionNeoBasicImpl

Спасибо


person db80    schedule 16.02.2018    source источник


Ответы (2)


Это невозможно.

Если ваш перехватчик является последним перед приложением, вы можете проверить класс handler и увидеть имя его родительского класса. Но это очень ограничено и не обязательно поддерживается.

person Eric Anderson    schedule 16.02.2018
comment
Спасибо за ответ. Таким образом, невозможно прочитать аннотации, присутствующие в классе TransactionNeoBasicImpl, из ServerInterceptor. Я прав? - person db80; 16.02.2018
comment
Верный. С перехватчика без ручной сантехники нельзя. - person Eric Anderson; 17.02.2018

Есть способ сделать это.

String fullMethodName = serverCall.getMethodDescriptor().getFullMethodName();
String serviceName = MethodDescriptor.extractFullServiceName(fullMethodName);

В основном fullMethodName имеет полное имя службы в качестве префикса (за которым следует «/»). Что-то вроде этого fullyqualified.ServiceName/MethodName

person Community    schedule 16.09.2018