Как я могу получить аннотации для вызова метода 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
с, а не копировать имя, как указано выше.