如何使用非String @RiakKey?

时间:2013-09-12 21:44:17

标签: java riak

是否可以将不是字符串的字段用作@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更改为String来执行此操作?

1 个答案:

答案 0 :(得分:0)

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

Keys是Riak是字符串(好的,从技术上讲,有些字节......但是UUID对象无需自动转换成任何字符串)。

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

这是相当直接的,显然你可以在github [1]上查看JsonConverter的来源,看看它目前是如何工作的。那里没什么好看的;我们使用Jackson进行JSON转换的注释处理有一些实用方法。

我还写了一本菜谱条目,包括编写和使用自定义转换器,它位于github上的wiki [2]。

[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月10日更新:我需要为客户端的1.1.x和1.4.x分支机构执行维护版本,所以我决定添加它。 1.1.3和1.4.2将支持@RiakKey的getter / setter方法。请参阅:https://github.com/basho/riak-java-client/pull/293