在 Riak java 客户端中,如何正确处理未找到 key/value 对象的情况

In the Riak java client, how to properly handle the case where a key/value object was not found

Riak 开发相对较新。我正在使用 C++ 客户端连接到 Riak java 客户端,该客户端又连接到 Riak 集群。 C++ 客户端使用 Google 协议缓冲区以 "GET":KEY 的形式将查询序列化为字符串,Riak java 客户端将响应序列化为 "OK":VALUE。如何正确处理数据库中找不到该值的情况?

这是 Riak java 客户端从数据库中检索对象的示例代码:

String key //Contains the actual key
Namespace ns;

byte[] retVal = null;

Location location = new Location(ns, key);

try {
  FetchValue fv;

  FetchValue.Response response = client.execute(fv);

  if (response.isNotFound()) {
    System.out.println("The key/value pair was not found");
  } else {
    RiakObject obj = response.getValue(RiakObject.class);
    retVal = obj.getValue().getValue();
  }
}
catch (...) {...}

return retVal;

}

如果找不到对象,byte[] 数组保持为 NULL

这是来自 Riak java 客户端的示例代码,用于序列化回复:

ByteString valueBuf = ByteString.copyFrom(value);

// Generate reply message
reply = Request.RequestMessage.newBuilder().setCommand("OK").setValue(valueBuf).build().toByteArray();

但是代码在 copyFrom 行抛出 NullPointerException,因为它试图从 Null 数组进行复制。有没有办法更干净地做到这一点?

谢谢!

在尝试 copyFrom() 调用之前,您应该检查是否 value == null

此外,您应该考虑使用 Go 的从 C (cgo) 调用的能力而不是 Java 客户端进行集成。我整理了一个very, very basic demonstration of doing that here.