如何获得在 grpc-java 中调用的 rpc 方法的注释
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
而不是像上面那样复制名称。
我需要在不同的验证器调用不同的 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
而不是像上面那样复制名称。