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
年前。
当我从服务器检索我的实体时,一切顺利,所有内容都由 getAsProperties
从 RequestBuilder
读取,没有任何异常。但是当它通过我的 "getter" 时,调用会抛出一个 ClassCastException
。 BigDecimals
的解析值似乎是 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 BigDecimal
或 BigInteger
没有逻辑。这可能是我们将来应该添加的东西,但是作为一种解决方法,我们有一个通用的扩展机制,可以让您自定义此代码。
还没有尝试过,但它通常可以工作:
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));
}
};
我正在重写我的一个应用程序的核心,其中一个主要变化是将我的实体迁移到 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
年前。
当我从服务器检索我的实体时,一切顺利,所有内容都由 getAsProperties
从 RequestBuilder
读取,没有任何异常。但是当它通过我的 "getter" 时,调用会抛出一个 ClassCastException
。 BigDecimals
的解析值似乎是 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 BigDecimal
或 BigInteger
没有逻辑。这可能是我们将来应该添加的东西,但是作为一种解决方法,我们有一个通用的扩展机制,可以让您自定义此代码。
还没有尝试过,但它通常可以工作:
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));
}
};