Bigdecimal 在属性中解析为 Double?

Bigdecimal parsed to Double in Properties?

我正在重写我的一个应用程序的核心,其中一个主要变化是将我的实体迁移到 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客户端(主要是一个咨询应用程序,结合了一个更大的网络应用程序),所以在涉及价格价值等方面,我们需要高精度,这导致我们BigDecimals年前。

当我从服务器检索我的实体时,一切顺利,所有内容都由 getAsPropertiesRequestBuilder 读取,没有任何异常。但是当它通过我的 "getter" 时,调用会抛出一个 ClassCastExceptionBigDecimals 的解析值似乎是 Doubles,因此它将我的 Property<BigDecimal, Product> 设置为 Double 值而不是 BigDecimal,后者后来导致 ClassCastExceptions.

这是 BigDecimal 属性 及其 getter/setter 的示例:

protected Property<BigDecimal, Product> priceBuy = new Property<>("priceBuy", BigDecimal.class);
public BigDecimal getPriceBuy() {
    return this.priceBuy.get();
}


public void setPriceBuy(BigDecimal priceBuy) {
    this.priceBuy.set(priceBuy);
}

有解决这个问题的想法或线索吗?

属性中 parsing/placing 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));
    }
};