2016-07-31 6 views
0

ektorp Javaクライアントを使用してオブジェクトをcouchdbに送信したいとします。しかし私はcoutdbにバイタル文字の値を正しく書き込むことができませんでした。私はStringにByteArrayの変換する場合bytearrayをcouchdbに書き込む方法は?

enter image description here

::次のように私のJavaオブジェクト

enter image description here

メタデータ値が "AgIGZm9vBmJhegA ="(BASE64)としてCouchDBの上に保存され、これがあることを意味します"foobaz"私のbytearray値はなぜ変わるのですか?

enter image description here

マイ例コード:

private CouchDbInstance dbInstance; 
private CouchDbConnector db;  

    ... 

    Map<String, Object> doc = new HashMap<>(); 
    doc.put("_id", "foo.com:http/"); 

    byte[] serilazeData = IOUtils.serialize(writer, fieldValue); 
    doc.put("metadata", serilazeData); 

    ... 
    db.update(doc); 

私の主なコードブロック

public void put(K key, T obj) { 

     final Map<String, Object> doc = new HashMap<>(); 
     doc.put("_id", key.toString()); 

     Schema schema = obj.getSchema(); 

     List<Field> fields = schema.getFields(); 
     for (int i = 0; i < fields.size(); i++) { 
      if (!obj.isDirty(i)) { 
      continue; 
      } 
      Field field = fields.get(i); 
      Schema.Type type = field.schema().getType(); 
      Object fieldValue = obj.get(field.pos()); 
      Schema fieldSchema = field.schema(); 

      fieldValue = serializeFieldValue(fieldSchema, fieldValue); 
      doc.put(field.name(), fieldValue); 
     } 
     db.update(doc); 

     } 

     private Object serializeFieldValue(Schema fieldSchema, Object fieldValue){ 
     ... 
      byte[] data = null; 
      try { 
       SpecificDatumWriter writer = getDatumWriter(fieldSchema); 
       data = IOUtils.serialize(writer, fieldValue); 
      } catch (IOException e) { 
       LOG.error(e.getMessage(), e); 
      } 
      fieldValue = data; 
     ... 
     return fieldValue; 
     } 

答えて

0

値は、base64エンコードされた文字列 "foobaz" です。この問題に関する意味のあるフィードバックを得るには、おそらくあなたのコードを投稿するべきです。

編集:コードを提供したので、更新しようとしているオブジェクトが既にデータベースに存在している可能性がありますか?はいの場合は、最初に取得するか、更新プログラムの適切な既存のリビジョンIDを指定する必要があります。それ以外の場合、更新は拒否されます。

+0

いいえ、最初はデータベースに関するデータがありません。 "db.update()"は、dbにデータがない場合、新しいデータを新しい行として追加します。私はテストケースを実行します。 – cguzel

0

CouchDBはJSONドキュメントを保存しています.JSONはバイト配列をサポートしていないため、CouchDBに送信する前にEktorpが独自のBase64変換をJSONに変換していて、アレイ。

Ektorpを呼び出す前に独自のBase64シリアル化を適用して、Ektorpの動作を回避し、CouchDBからドキュメントをフェッチした後に自分自身を逆シリアル化することをお勧めします。あるいは、バイト配列を含めたシーンの背後にあるオブジェクト/ JSON変換を処理するJacksonのようなものを使うこともできます。

0

Ektorpはjsonのシリアル化にJacksonを使用しています.Jacksonはバイト配列の場合、base64にデフォルト設定されていると思います。あなたがEktorpで読み書きする限り、何の問題もないはずです。

しかし、あなたのコードには、あなた自身のタイプのシステムがあるので、複雑なものがあることが分かります。私は、あなた自身でそれをやっているなら、あなたはektorpとjacksonから多くの助けを得ることはないので、自分自身を動かす代わりにPOJOSを使うことをお勧めします。

関連する問題