我需要在使用不同的验证器调用不同的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 :(得分: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
,而不是像上面那样复制名称。