我在RIAK上存储Person POJO(4个字符串字段-id,name,lastUpdate,Data),然后尝试使用MapReduce提取这些对象。
我正在做的非常类似于Basho文档:
BucketMapReduce m = riakClient.mapReduce("person"); m.addMapPhase(new NamedJSFunction("Riak.mapByFields"), true); MapReduceResult result = m.execute(); Collection<Person> tmp = result.getResult(Person.class);
Person的String构造函数被调用:
public Person(String str){}
(我必须具有此构造函数,否则会因缺少异常而得到异常)。在那里,我将对象作为字符串获得-一个字符串中的对象字段具有一个奇怪的定界符。
为什么我没有将对象自动转换为POJO?我真的需要遍历字符串并反序列化吗?我做错什么了吗?
您正在使用的JS函数无法执行您认为的工作:)它基于具有特定值的字段选择对象,您必须提供该特定值作为阶段的参数。
我认为您正在寻找的是mapValuesJson可以做您想做的事。
mapValuesJson
另外,您的POJO中根本不需要构造函数。
下面的代码应该为您指明正确的方向(显然,这非常简单,POJO中的所有公共字段都没有注释):
public class App { public static void main( String[] args ) throws IOException, RiakException { IRiakClient client = RiakFactory.httpClient(); Bucket b = client.fetchBucket("test_mr").execute(); b.store("myobject", new Person()).execute(); IRiakObject o = b.fetch("myobject").execute(); System.out.println(o.getValueAsString()); BucketMapReduce m = client.mapReduce("test_mr"); m.addMapPhase(new NamedJSFunction("Riak.mapValuesJson"), true); MapReduceResult result = m.execute(); System.out.println(result.getResultRaw()); Collection<Person> tmp = result.getResult(Person.class); for (Person p : tmp) { System.out.println(p.data); } client.shutdown(); } } class Person { public String id = "12345"; public String name = "my name"; public String lastUpdate = "some time"; public String data = "some data"; }