3

我有一个简单的对象,我正在尝试读/写到 couchbase(使用弹簧数据)。这是对象:

@Document
public class CacheObject {
  @Id
  private String id;
  private byte[] data;

  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public byte[] getData() {
    return data;
  }
  public void setData(byte[] data) {
    this.data = data;
  }  
}

我尝试使用 Couchbase 模板读/写它:

  @Test
  public void test2() throws Exception {
    CacheObject o = new CacheObject();
    o.setId("test1");
    o.setData("test123".getBytes());
    CouchbaseTemplate t = c.couchbaseTemplate();

    t.save(o);
    CacheObject o2 = t.findById("test1", CacheObject.class);
    System.out.println("COOL " + new String(o2.getData()));
  }

该模板来自扩展 AbstractCouchbaseConfiguration 的配置。

写入工作正常,我在 couchbase 中看到了 base64 编码值。读取抛出异常:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type byte for value 'd293'; nested exception is java.lang.NumberFormatException: For input string: "d293"
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:189)
    at org.springframework.core.convert.support.StringToArrayConverter.convert(StringToArrayConverter.java:63)
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35)
...

我可以通过使用自定义阅读器来解决这个问题(这是在我扩展 AbstractCouchbaseConfiguration 的配置中)。使用此代码,一切正常。

 public CustomConversions customConversions() {
   return new CustomConversions(Arrays.asList(StringToByteConverter.INSTANCE));
  }

  @ReadingConverter
  public static enum StringToByteConverter implements Converter<String, byte[]> {
    INSTANCE;

    @Override
    public byte[] convert(String source) {
      return Base64.decodeBase64(source);
    }
  }

难道我做错了什么?

我已经尝试过 1.2.2 和 1.3.0.M1 并且都给出了相同的结果。

谢谢

4

1 回答 1

1

我认为你这样做是正确的。如果您观察存储在 Couchbase 中的 json,它看起来像这样:

{“_class”:“CacheObject”,“数据”:“dGVzdDEyMw==”}

当您尝试将数据属性转换回 CacheObject 时,它会尝试将上面的字符串转换为原始字节数组,因此会出现 NumberFormatException。您是否正在尝试通过以您的方式存储字节数组来完成某些事情?

根据您正在测试的方法,我认为您需要一个自定义转换器来按预期转换字节数组的字符串版本,因为 couchbase 模板默认不支持这种类型。有关支持的类型,请参阅此链接:

http://docs.couchbase.com/developer/dev-guide-3.0/using-json-docs.html

希望这可以帮助。

于 2015-03-22T03:49:27.057 回答