我正在重写其中一个应用程序的核心,其中一项主要更改是将我的实体迁移到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>
当我从服务器检索实体时,一切顺利,getAsProperties
从RequestBuilder
读取所有内容,没有任何例外。但是,当它通过我的“ getter”时,该调用将引发一个ClassCastException
。看来BigDecimals
的解析值是Doubles
,所以它将我的Property<BigDecimal, Product>
设置为Double
而不是BigDecimal
,后者随后会导致{{ 1}}。
以下是ClassCastExceptions
属性及其获取器/设置器的示例:
BigDecimal
有什么想法或解决此问题的方法吗?
答案 0 :(得分:1)
在属性中没有解析/放置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));
}
};