我有一个 grpc-java 服务器,需要在处理请求之前对身份验证服务进行异步调用。我认为这应该在拦截器中完成,但它需要从interceptCall()同步返回一个Listener
class AuthInterceptor implements ServerInterceptor {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
ServerCall<ReqT, RespT> call,
Metadata headers,
ServerCallHandler<ReqT, RespT> next
) {
String token = ""; //get token from headers
authService.authorize(token).subscribe(
ok -> // process the request
error -> call.close(Status.UNAUTHENTICATED, headers)
);
// Here we need to return a Listener, but we haven't started a call yet
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:如何从 ServerInterceptor 进行异步调用,如果无法完成,那么异步验证 grpc 请求的正确方法是什么?我知道它可以直接在 grpc 服务中使用 StreamObservers 完成,但请求授权是一个交叉问题,拦截器似乎是一个完美的地方。
我在Java中有以下代码:
Enum getEnumValue(Class<?> enumClass, String value) {
return Enum.valueOf((Class<Enum>) enumClass, value);
}
Run Code Online (Sandbox Code Playgroud)
如何用Kotlin重写它?
更新资料
enumValueOf<>()函数在这种情况下不适用,因为我不知道实际的类型参数,我只有一个Class<?>类型未知的对象(Class<*>在kotlin中)和一个名称字符串。已知该类为枚举: Class.isEnum返回true。使用这两个输入,上面的Java代码允许获取具有原始类型的枚举的值。这正是我所需要的,因为我对枚举的特定类型不感兴趣。但是我不知道如何在kotlin中获得相同的结果。