0

是否可以使用不是字符串的字段作为@RiakKey?这是我所拥有的:

public class DomainObject {
  @RiakKey private UUID objectId;
}

不幸的是,当前的 (v1.4.0) java 客户端在反序列化上设置了密钥:

java.lang.IllegalArgumentException: Can not set java.util.UUID field com.company.DomainObject.objectId to java.lang.String
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) ~[na:1.7.0_25]
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) ~[na:1.7.0_25]
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) ~[na:1.7.0_25]
at java.lang.reflect.Field.set(Field.java:741) ~[na:1.7.0_25]
at com.basho.riak.client.convert.reflect.ClassUtil.setFieldValue(ClassUtil.java:45) ~[riak-client-1.4.0.jar:na]
at com.basho.riak.client.convert.reflect.AnnotationInfo.setRiakKey(AnnotationInfo.java:149) ~[riak-client-1.4.0.jar:na]
...snip

有没有办法通过将 UUID 更改为字符串来在不降低域对象的情况下做到这一点?

4

1 回答 1

0

使用默认JsonConverter和注释处理?不。

键是 Riak 是字符串(好吧,从技术上讲,一些字节......但仍然肯定没有UUID对象会自动转换成)。

最简单的方法(坦率地说,考虑到反射的开销,更快的方法)是编写自己的Converter<T>并使用它而不是默认的JsonConverter. 您可以放弃我们的注释处理,也可以将其用于除 UUID 之外的所有内容。

这相当简单,显然您可以查看JsonConvertergithub[1] 上的源代码以了解它当前的工作方式。那里没有什么花哨的东西。有一些实用方法可以进行注释处理,我们使用 Jackson 进行 JSON 转换。

我还写了一篇关于编写和使用自定义转换器的食谱条目,它位于 github[2] 上的 wiki 中。

[1] https://github.com/basho/riak-java-client/blob/1.4.1/src/main/java/com/basho/riak/client/convert/JSONConverter.java

[2] https://github.com/basho/riak-java-client/wiki/Using-a-custom-Converter

编辑添加: 真正可以解决您的问题的缺失部分是@RiakKey注释处理是否支持方法,不幸的是目前不支持。这是我们计划在我们目前正在处理的客户端的 v2.0 重写中添加的内容。

2013 年 10 月 4 日更新:我需要为客户端的 1.1.x 和 1.4.x 分支进行维护发布,所以我决定也添加它。1.1.3 和 1.4.2 将支持@RiakKey. 见:https ://github.com/basho/riak-java-client/pull/293

于 2013-09-13T01:05:05.063 回答