Bigdecimal проанализирован для удвоения в свойствах?

#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, но он тоже должен работать, и я знаю, где доработать мой код, если это не так.