Как я могу получить аннотации для вызова метода rpc в grpc-java

Мне нужно проверить запрос перед вызовом разных методов rpc с разными валидаторами.

Поэтому я реализовал валидаторы, такие как

class BarRequestValidator {
    public FooServiceError validate(BarRequest request) {
        if (request.bar.length > 12) {
            return FooServiceError.BAR_TOO_LONG;
        } else {
            return null;
        }
    }
}

и добавить пользовательскую аннотацию перед моим методом RPC

class FooService extends FooServiceGrpc.FooServiceImplBase {
    @Validated(validator = BarRequestValidator.class)
    public void bar(BarRequest request, StreamObserver<BarResponse> responseObserver) {
        // Validator should be executed before this line, and returns error once validation fails.
        assert(request.bar <= 12);
    }
}

Но я обнаружил, что не могу найти способ получения информации аннотации в gRPC ServerInterceptor. Есть ли способ реализовать проверку запроса grpc, как это?

1 ответ

Решение

Вы можете сделать это, не имея аннотации вообще, и просто используя простой ServerInterceptor:

Server s = ServerBuilder.forPort(...)
    .addService(ServerInterceptors.intercept(myService, myValidator))
    ...

private final class MyValidator implements ServerInterceptor {
  ServerCall.Listener interceptCall(call, headers, next) {
    ServerCall.Listener listener = next.startCall(call, headers);
    if (call.getMethodDescriptor().getFullMethodName().equals("service/method")) {
      listener = new SimpleForwardingServerCallListener(listener) {
        @Override
        void onMessage(request) {
          validate(request);
        }
      }
    }
    return listener;
  }
}

Обратите внимание, что я пропускаю большую часть шаблона здесь. Когда приходит запрос, перехватчик получает его первым и проверяет, соответствует ли он ожидаемому методу. Если так, это делает дополнительную проверку. В сгенерированном коде вы можете ссылаться на существующий MethodDescriptorс, а не копировать имя, как указано выше.

Другие вопросы по тегам