2016-07-31 2 views
0

ektorp 자바 클라이언트를 사용하여 내 객체를 couchdb에 보내고 싶습니다. 하지만 필자의 바이타 레이 값을 couchdb에 올바로 쓸 수는 없었다.bytearray를 couchdb에 작성하는 방법은 무엇입니까?

enter image description here

내가 문자열로 된 ByteArray를 변환하면 : : 다음과 같은 내 자바 객체

enter image description here

메타 데이터 값은 다음과 같이 CouchDB를에 저장됩니다 "AgIGZm9vBmJhegA ="는 (64 기수)이 있음을 의미 "foobaz". 왜 내 바이어 레이 값이 변경 되었습니까?

enter image description here

내 예 번호 :

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

값은 문자열 "foobaz"를 base64 인코딩이다

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); 

내 주요 부호 블록. 이 문제와 관련하여 의미있는 의견을 얻으려면 코드를 게시해야합니다.

편집 : 이제 코드를 제공 했으므로 업데이트하려는 객체가 이미 데이터베이스에 있습니다. 그렇다면 먼저 업데이트를 얻거나 업데이트를위한 적절한 기존 개정 ID를 제공해야합니다. 그렇지 않으면 업데이트가 거부됩니다.

+0

아니요, 처음에는 데이터베이스에 대한 데이터가 없습니다. "db.update()"는 db에 데이터가없는 경우 새 데이터를 새 행으로 추가합니다. 테스트 케이스를 실행합니다. – cguzel

0

CouchDB는 JSON 문서를 저장하고 JSON은 바이트 배열을 지원하지 않으므로 Ektorp는 CouchDB로 보내기 전에 개체를 JSON으로 변환하는 동안 자체 Base64 변환을 적용하고 바이트에서 일부 문자를 건너 뛰고있다 정렬.

Ektorp를 호출하기 전에 고유 한 Base64 serialization을 적용하여 Ektorp 동작을 회피 한 다음 CouchDB에서 문서를 가져온 후 deserialize하는 것이 좋습니다. 또는 바이트 배열을 비롯하여 장면 뒤에서 객체/JSON 변환을 처리하는 Jackson과 같은 것을 사용할 수도 있습니다.

0

Ektorp는 json serialization을 위해 Jackson을 사용합니다. Jackson은 바이트 배열의 경우 base64로 기본 설정되어 있다고 생각합니다. Ektorp로 읽고 쓰는 한 아무런 문제가 없어야합니다.

그러나 나는 당신의 코드에서 자신이 가지고있는 일종의 타입 시스템을 가지고 있다는 것을 알았습니다. 나는 당신이 스스로하는 경우 ektorp와 jackson으로부터 많은 도움을 얻지 않을 것이기 때문에 당신 자신을 굴리기보다는 POJOS를 사용할 것을 제안한다.

관련 문제