当前位置: 首页 > 知识库问答 >
问题:

我怎样才能在grpc java中获得rpc方法的注释

曹恩
2023-03-14

在使用不同的验证器调用不同的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个答案

勾起运
2023-03-14

您可以在没有注释的情况下完成此操作,只需使用普通的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;
  }
}

请注意,我在这里跳过了大部分样板。当一个请求进来时,拦截器首先获取它并检查它是否符合它所期望的方法。如果是这样,它会进行额外的验证。在生成的代码中,您可以引用现有的Method odDescriptors,而不是像上面那样复制名称。

 类似资料:
  • 我有适当的基于ORM的post和tags表。在数据透视表上分配给post的标记。发帖- 这是我的数据库: 我想检索所有有特殊标签名称的帖子。

  • 我有一个问题,在我看来挺简单的,但到目前为止还不可能找到一个简单的解决方案:在我的网站上,每当Android软键盘弹出时,它就会调整窗口大小,缩小内容,而不是仅仅覆盖页面。 前两个是现状,第三个是我想要的。在iOS上是这样工作的。我该怎么做才能让它正常工作呢? 我试着设定身体的大小和位置,但到目前为止,没有运气。我已经看到了一些非常复杂的JS代码片段来解决类似的问题,但是我没有让它们按照我想要的方

  • 如何获取已设置为ImageView的可绘图文件的名称?

  • 我最近开始使用在我的android应用程序上播放流链接,比如和文件,但当我试图播放文件,以下消息开始出现在Android logcat中: 源错误。com.google.android.exoplayer2.source.无法识别的输入格式异常:输入不以#EXTM3U头开始。在com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist

  • 我使用Selenium,需要无休止地等待页面加载(因为加载需要几个小时),然后解析其中的数据。我该怎么做? 我使用这样的一些代码:

  • 当我使用jsole访问weblogic的mbean时,我只能得到一些关于jvm的信息,比如“java.lang”。但是我想得到的是关于“jdbc”、“jta”、“ejb”、“servlet”... 我想知道是否可以通过服务获得这些指标:jmx:rmi:///jndi/rmi://10.0.99.102:7997/jmxrmi使用用户名和密码。我认为我的配置很可能有错误,但我不知道问题出在哪里。 然