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

时间:2016-04-27 11:49:32

标签: java riak protocol-buffers

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

这是来自Riak java客户端的示例代码,用于从db:

中检索对象
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数组复制。有没有办法更干净地做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

在尝试value == null来电之前,您应该先查看是否copyFrom()

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