首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得grpc-java中调用的rpc方法的注释?

如何获得grpc-java中调用的rpc方法的注释?
EN

Stack Overflow用户
提问于 2016-12-11 18:18:49
回答 1查看 1.2K关注 0票数 0

在用不同的验证器调用不同的rpc方法之前,我需要验证请求。

所以我实现了验证器,如

代码语言:javascript
复制
class BarRequestValidator {
    public FooServiceError validate(BarRequest request) {
        if (request.bar.length > 12) {
            return FooServiceError.BAR_TOO_LONG;
        } else {
            return null;
        }
    }
}

并在rpc方法之前添加一个自定义注释。

代码语言:javascript
复制
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请求验证?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-14 04:37:41

您可以在不需要注释的情况下完成这一任务,只需使用普通的ServerInterceptor:

代码语言:javascript
复制
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,而不是像上面那样复制名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41089459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档