在属性中将Bigdecimal解析为Double?

时间:2019-04-01 13:06:53

标签: codenameone

我正在重写其中一个应用程序的核心,其中一项主要更改是将我的实体迁移到PropertyBusinessObjects

我已经编写了一个小工具,可以从服务器端PropertyBusinessObjects编写JPAEntities,以限制愚蠢的复制粘贴所花费的时间并利用我的工作量,因此几乎所有的CN1实体都被重写为PBO 。

为了不重写使用classic getters/setters的所有代码,我将pseudo getter/setters的创建添加到了我的生成代码中以获得这种结果:

protected Property<String, Product> reference = new Property<>("reference");
public String getReference() {
    return this.reference.get();
}

public void setReference(String reference) {
    this.reference.set(reference);
}

结果几乎是完美的,但是在BigDecimal方面遇到了一些麻烦。我们的应用程序是ERP客户(主要是咨询应用程序,它与更大的Web应用程序结合使用),因此,在价格等方面,我们需要很高的精度,这导致我们在BigDecimals年前就走了。 / p>

当我从服务器检索实体时,一切顺利,getAsPropertiesRequestBuilder读取所有内容,没有任何例外。但是,当它通过我的“ getter”时,该调用将引发一个ClassCastException。看来BigDecimals的解析值是Doubles,所以它将我的Property<BigDecimal, Product>设置为Double而不是BigDecimal,后者随后会导致{{ 1}}。

以下是ClassCastExceptions属性及其获取器/设置器的示例:

BigDecimal

有什么想法或解决此问题的方法吗?

1 个答案:

答案 0 :(得分:1)

在属性中没有解析/放置BigDecimalBigInteger的逻辑。这可能是我们将来应该添加的内容,但是作为一种解决方法,我们具有通用的扩展机制,可让您自定义此代码。

还没有尝试过,但是通常可以正常工作:

MapAdapter m = new MapAdapter(BigDecimal.class) {
    public void placeInMap(PropertyBase b, Map m) {
        // this might be unnecessary
        m.put(b.getName(), b.get());
    }

    public void setFromMap(PropertyBase b, Map m){
        long d = (long)(m.get(b.getName()) * 10000);

        b.setImpl(new BigDecimal(new BigInteger(d), 5));
    }
};