2016-12-11 11 views
0

さまざまなバリデータで異なる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リクエストの検証を実装する方法はありますか?

答えて

0

あなたは、すべての注釈を持つ、そして単なる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を参照できます。

関連する問題