是否可以将不是字符串的字段用作@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来执行此操作?
答案 0 :(得分:0)
使用默认的JsonConverter
和注释处理?否。
Keys是Riak是字符串(好的,从技术上讲,有些字节......但是UUID
对象无需自动转换成任何字符串)。
最简单的方法(坦率地说,考虑到反射开销的更快方式)是编写自己的Converter<T>
并使用它而不是默认的JsonConverter
。您可以放弃我们的注释处理,也可以将其用于除UUID之外的所有内容。
这是相当直接的,显然你可以在github [1]上查看JsonConverter
的来源,看看它目前是如何工作的。那里没什么好看的;我们使用Jackson进行JSON转换的注释处理有一些实用方法。
我还写了一本菜谱条目,包括编写和使用自定义转换器,它位于github上的wiki [2]。
[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