#codenameone
#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 (в основном приложение для консультаций, которое объединено с гораздо большим веб-приложением), поэтому, когда дело доходит до значений цен и так далее, нам нужна высокая точность, которая привела нас к BigDecimals
годам назад.
Когда я извлекаю свои объекты с сервера, все идет хорошо, все считывается getAsProperties
из RequestBuilder
без каких-либо исключений. Но когда он проходит через мой «getter», вызов выдает ClassCastException
. Похоже, что проанализированное значение для BigDecimals
равно Doubles
, поэтому оно устанавливает мое Property<BigDecimal, Product>
со Double
значением вместо BigDecimal
, которое позже вызовет ClassCastExceptions
.
Вот пример BigDecimal
свойства и его средства получения / установки :
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);
}
Есть идеи или рекомендации по решению этого вопроса?
Ответ №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));
}
};
Комментарии:
1. Спасибо, Шай, я забыл, что я уже использовал это в другом приложении для свойства перечисления. Он отлично работает при чтении данных, я все еще не пробовал писать json, но он тоже должен работать, и я знаю, где доработать мой код, если это не так.