[英]How can I get annotations on rpc method being called in 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请求验证吗?
您可以完全不用注释,而只需使用简单的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
而不是像上面那样复制名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.