如何使用Objectify使用BigDecimalLongTranslatorFactory存储BigDecimals?

时间:2013-10-04 04:18:50

标签: google-app-engine objectify

我需要在我的实体中存储货币值(未编入索引),而我正在

java.lang.IllegalArgumentException: kmrate: java.math.BigDecimal is not a supported property type.

谷歌搜索,似乎BigDecimalLongTranslatorFactory可能是解决方案的一部分,但我找不到任何文档或示例。

1 个答案:

答案 0 :(得分:1)

BigDecimalLongTranslatorFactory()的文档说“在执行注册的同时”安装它,但我发现它必须在注册之前。

例如,使用推荐的"Use Your Own Service"方法注册实体,以下内容将导致包含BigDecimal属性的实体的后续save()失败,并显示UnsupportedOperationException(消息“Unsupported data type:java.math。的BigDecimal“):

public class OfyService {
    static {
        factory().register(Thing.class);
        factory().register(OtherThing.class);
        factory().getTranslators().add(new BigDecimalLongTranslatorFactory());
    }

    public static Objectify ofy() {
        return ObjectifyService.ofy();
    }
    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }
}

但如果我在注册前这样做,它就有效:

public class OfyService {
    static {
        factory().getTranslators().add(new BigDecimalLongTranslatorFactory());
        factory().register(Thing.class);
        factory().register(OtherThing.class);
    }

    public static Objectify ofy() {
        return ObjectifyService.ofy();
    }
    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }
}

我没有深入Objectify的翻译系统,看看为什么会这样。

注意:我正在使用Objectify 4.0b3。