1

Person POJO (4 つの文字列フィールド - id、name、lastUpdate、Data) を RIAK に保存し、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){}

(このコンストラクターが必要です。そうしないと、欠落しているという例外が発生します) そこで、オブジェクトを文字列として取得します。オブジェクトのフィールドは、奇妙な区切り文字を持つ 1 つの文字列になります。

オブジェクトが自動的に POJO に変換されないのはなぜですか? 本当に文字列を調べて逆シリアル化する必要がありますか? 私は何か間違ったことをしていますか?

4

1 に答える 1

3

使用しているJS関数は、あなたが思っていることをしません:)フェーズへの引数として指定する必要がある特定の値を持つフィールドに基づいてオブジェクトを選択します。

あなたが探しているのは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";


}
于 2012-07-18T18:40:43.907 に答える