Проблема весенней загрузки и BigDecimal или двойной сериализации - PullRequest
0 голосов
/ 09 февраля 2020


Я не могу правильно обработать инициализацию BigDecimal, у меня есть объект, у которого есть поле BigDecimal, например:

@Entity
public class Menu{
...
   @Digits(integer=6, fraction=2)
   private BigDecimal price;
...
public BigDecimal getPrice() {
    return price;
}

public void setPrice(BigDecimal price) {
    this.price = price;
}
...
other generated getters and setters toString etc.
...
}

И во внешнем интерфейсе я использую тимелеф в форме html (которая добавляет и обновляет новый пункт меню) у меня есть этот вход для значения большого десятичного числа:

<div class="form-group">
        <label for="price">Enter Price</label>
        <input type="number"  class="form-control" step="0.01" id="price" name="price" th:field="*{price}" placeholder="enter Price" value=" ">
</div>

И для ограничения пользователя, чтобы ввести более 2 di git точность значения цены, у меня есть код js как это:

$('#price').keypress(function (e) {
                var character = String.fromCharCode(e.keyCode)
                var newValue = this.value + character;
                if (isNaN(newValue) || parseFloat(newValue) * 100 % 1 > 0) {
                    e.preventDefault();
                    return false;
                }
            });

Вопрос : когда пользователь вводит значение 10,25 в форме, тимелист отображает его как 10,2499998 ... Даже другие конечные точки остальных возвращают эту сущность со значением в json, например, 10.249999. Но когда я посмотрел на свою базу данных (postgresql и, конечно, я использую jpa), это значение кажется вполне подходящим - 10,25. Поэтому я знаю, что при инициализации нового значения BigDecimal конструктор должен быть похож на новый BigDecimal ("10.25") со строкой в ​​параметре. Но все, что у меня есть, - это методы получения и установки по умолчанию, а мой контроллер - простой постконтроллер для сохранения сущностей, например:

@PostMapping("/additem")
    public String addItemPost(@ModelAttribute(value="menu") @Valid Menu menu,Model model,BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "addmenuitem";
        }
        this.menuService.saveMenuItem(menu);
        return "redirect:/restaurant/menu";
    }

Проблема 2: Я попытался изменить BigDecimal со значением Double, и после этого форма ввода принимает значение, как мы предлагаем, и я вижу это значение везде правильно. Но если я пишу больше di git после запятой, функция js блокирует мне запись более 2 di git, но реальное значение снова становится 10.2499999 ...
Должно быть, это что-то в стратегии Spring, заключающейся в том, чтобы брать значения из формы тимелина, а затем инициализировать эти значения в сущности, но я никогда не делаю этого вручную, так как сосед не может их отладить.
Так что я не знаю, проблема в том, что моя javascript функция или моя форма ввода или тип переменной. Пожалуйста, помогите. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 февраля 2020

Я нашел проблему и пишу здесь, если кто-то сталкивается с такой проблемой. Моя проблема не была в localhost, но произошла на heroku. Так что я понял, что в heroku postgresql db мои столбцы BigDecimal не обновлялись и в localhost они менялись всякий раз, когда я перезапускался из-за выбора стратегии создания таблицы jdb c. Я сделал атрибут сущности Double и изменил удаленные столбцы БД на двойную точность, чем решаемая проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...