问题描述
在尝试使用Google KSM SDK版本1.40.0
解密密码字符串时遇到以下错误。
使用的代码:
try (KeyManagementServiceClient keyManagementServiceClient = KeyManagementServiceClient.create()) {
CryptoKeyName name = CryptoKeyName.of("[PROJECT]","[LOCATION]","[KEY_RING]","[CRYPTO_KEY]");
ByteString ciphertext = ByteString.copyFromUtf8("");
DecryptResponse response = keyManagementServiceClient.decrypt(name.toString(),ciphertext);
}
错误:
Caused by: java.lang.IllegalAccessError: tried to access field com.google.protobuf.AbstractMessage.memoizedSize from class com.google.cloud.kms.v1.DecryptRequest
at com.google.cloud.kms.v1.DecryptRequest.getSerializedSize(DecryptRequest.java:472)
at io.grpc.protobuf.lite.ProtoInputStream.available(ProtoInputStream.java:108)
at io.grpc.internal.MessageFramer.getKNownLength(MessageFramer.java:205)
at io.grpc.internal.MessageFramer.writePayload(MessageFramer.java:137)
at io.grpc.internal.AbstractStream.writeMessage(AbstractStream.java:65)
at io.grpc.internal.ForwardingClientStream.writeMessage(ForwardingClientStream.java:37)
at io.grpc.internal.ClientCallImpl.sendMessageInternal(ClientCallImpl.java:544)
at io.grpc.internal.ClientCallImpl.sendMessage(ClientCallImpl.java:528)
at io.grpc.ForwardingClientCall.sendMessage(ForwardingClientCall.java:37)
at io.grpc.stub.ClientCalls.asyncUnaryRequestCall(ClientCalls.java:308)
at io.grpc.stub.ClientCalls.futureUnaryCall(ClientCalls.java:218)
at com.google.api.gax.grpc.GrpcDirectCallable.futureCall(GrpcDirectCallable.java:58)
at com.google.api.gax.grpc.GrpcUnaryRequestParamCallable.futureCall(GrpcUnaryRequestParamCallable.java:65)
at com.google.api.gax.grpc.GrpcExceptionCallable.futureCall(GrpcExceptionCallable.java:64)
at com.google.api.gax.rpc.AttemptCallable.call(AttemptCallable.java:86)
at com.google.api.gax.rpc.retryingCallable.futureCall(retryingCallable.java:63)
at com.google.api.gax.rpc.retryingCallable.futureCall(retryingCallable.java:41)
at com.google.api.gax.tracing.TracedUnaryCallable.futureCall(TracedUnaryCallable.java:75)
at com.google.api.gax.rpc.UnaryCallable$1.futureCall(UnaryCallable.java:126)
at com.google.api.gax.rpc.UnaryCallable.futureCall(UnaryCallable.java:87)
... 27 more
请帮助。
解决方法
这是因为在类路径中有不同版本的protobuf。使用一些阴影插件在最终的构建jar中重命名proto类。
sbt(汇编)示例 ::: https://github.com/sbt/sbt-assembly#shading
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.google.protobuf.**" -> "shade.protobuf.@1").inAll,)