データベースでUUIDを何かと使うのですが、
JSONで出力すると'afb055a0-c18f-11e3-8b27-b1398a321474'みないな
文字列になってちょっと長いですし、
UUIDだというのがバレバレでそこはかとなく心配になります。
なので、JSONマッパーに渡すUUIDをwrapしてBase64としてマップするクラスを作ったので共有
表題にある通りJackson向けです
@JsonValueアノテーションをつけることで
このクラスをシリアライズする際にtoString()が呼ばれBase64化された値を返します
デシリアライズ 時には、
UUIDBase64(String uuidBase64)で初期化されUUIDBase64クラスとしてマップされます。
UUIDBase64.java :
import java.nio.ByteBuffer;
import java.util.UUID;
import org.apache.commons.codec.binary.Base64;
import org.codehaus.jackson.annotate.JsonValue;
import org.codehaus.jackson.annotate.JsonIgnore;
public class UUIDBase64 {
@JsonIgnore
private final UUID uuid;
public UUIDBase64(UUID uuid) {
this.uuid = uuid;
}
public UUIDBase64(String uuidBase64) {
byte[] bytes = Base64.decodeBase64(uuidBase64);
ByteBuffer bb = ByteBuffer.wrap(bytes);
this.uuid = new UUID(bb.getLong(), bb.getLong());
}
@JsonValue
public String toString(){
if (uuid == null)
return null;
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return Base64.encodeBase64URLSafeString(bb.array());
}
public UUID getUUID() {
return this.uuid;
}
public static UUIDBase64 fromUUID(UUID uuid) {
return new UUIDBase64(uuid);
}
public static UUIDBase64 fromBase64(String str) {
return new UUIDBase64(str);
}
}
次のように変換されます
class User {
UUIDBase64 id;
}
<-> { "id" : "base64の文字列" }->
2014年4月17日木曜日
2014年3月25日火曜日
Cassandra3.x CQLでBlobを扱う
CassandraでのBlobの扱いに半日ぐらい使ったので覚書
Cassandra3.0、datastax driver 2.0
でCQLを利用してBlobを扱う場合、
bindにByteBufferをかまさないといけません。
それと、row.getBytes()で取得したByteBufferをそのままarray()しても
ゴミの入ったbyte[]になってしまいます。
なので、次のようにする
bind時
byte[] byteArray;
prepare(cql).bind(ByteBuffer.wrap(byteArray));
取得時
import com.datastax.driver.core.utils.Bytes;
byte[] byteArray = Bytes.getArray(row.getBytes("bytes"));
Cassandra3.0、datastax driver 2.0
でCQLを利用してBlobを扱う場合、
bindにByteBufferをかまさないといけません。
それと、row.getBytes()で取得したByteBufferをそのままarray()しても
ゴミの入ったbyte[]になってしまいます。
なので、次のようにする
bind時
byte[] byteArray;
prepare(cql).bind(ByteBuffer.wrap(byteArray));
取得時
import com.datastax.driver.core.utils.Bytes;
byte[] byteArray = Bytes.getArray(row.getBytes("bytes"));
登録:
投稿 (Atom)