Форматирование Thymeleaf-Spring BigDecimal с помощью @NumberFormat добавляет дополнительные символы

Я использую Thymeleaf 2.1.2.RELEASE с Spring MVC 4.0.4.RELEASE

У меня есть динамическая форма, которую я использую, чтобы добавить новые строки заказа в заказ.

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я добавляю строку и содержимое перерисовывается, добавляется дополнительный символ перед символом валюты в столбце цены каждой из предыдущих строк.

Так что, если я добавлю три строки, я получу

  1. ÂÂ £ 22.00
  2. Â £ 22.00
  3. £ 22,00

Поле цены имеет значение BigDecimal с @NumberFormat(style = NumberFormat.Style.CURRENCY), поэтому Spring должен обработать преобразование.

<div>
    <label th:text="#{order.lines}">Order Lines</label>
    <table id="addTable" dt:table="true" dt:sort="false" dt:paginate="false" dt:info="false" dt:lengthchange="false">
        <thead>
        <tr>
            <th th:text="#{order.lines.head.linenum}">line</th>
            <th th:text="#{order.lines.head.product}">Product</th>
            <th th:text="#{order.lines.head.description}">Description</th>
            <th th:text="#{order.lines.head.quantity}">Quantity</th>
            <th th:text="#{order.lines.head.price}">Price</th>
            <th>
                <button type="submit" name="addLine" th:text="#{order.line.add}">Add line</button>
            </th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="line,lineStat : *{lines}">
            <td th:text="${lineStat.count}">1</td>

            <td>
                <input type="text" th:field="*{lines[__${lineStat.index}__].productIdentifier}"
                       th:errorclass="fieldError"/>
            </td>
            <td>
                <input type="text" th:field="*{lines[__${lineStat.index}__].description}"
                       th:errorclass="fieldError"/>
            </td>
            <td>
                <input type="text" th:field="*{lines[__${lineStat.index}__].quantity}"
                       th:errorclass="fieldError"/>
            </td>
            <td>
                <input type="text" th:field="*{{lines[__${lineStat.index}__].price}}"

                       th:errorclass="fieldError"/>
            </td>
            <td>
                <button type="submit" name="removeLine" th:value="${lineStat.index}"
                        th:text="#{order.line.remove}">Remove line
                </button>
            </td>
        </tr>
        </tbody>
    </table>
</div>

Это затем поддерживается классом с

public class OrderLine implements Serializable {
    @NotEmpty
    private String description;

    @NotNull
    @NumberFormat(style = NumberFormat.Style.CURRENCY)
    private BigDecimal price;

    @NotEmpty
    private String productIdentifier;

    @NotNull
    @Min(value = 1)
    private Integer quantity;

а потом в моем контроллере

@RequestMapping(value="/customer/orders", params={"addLine"})
public String addLine(final Order order, final BindingResult bindingResult) {
    order.getLines().add(new OrderLine());
    return "customer/orders";
}

HTML-страница включает в себя

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

и фильтр сервлета кодировки символов настроен, как показано ниже

@Override     
protected Filter[] getServletFilters() {
    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();              
    characterEncodingFilter.setEncoding("UTF-8");         
    characterEncodingFilter.setForceEncoding(true);         
    return new Filter[] {characterEncodingFilter};     
}

В дополнение к этому, используя Fiddler, я вижу, что заголовок ответа на запрос ajax datatables из одуванчика неправильно кодируется как ISO-88591. Я использую datatables-тимелиф 0.93 с datatables 1.9.4

После экспериментов, если я установил кодировку тимелина, фильтр сервлета пружины и метатег html на ISO-88591, символ валюты отображается правильно, хотя мне бы хотелось, чтобы это работало с UTF-8.

В конце концов я нашел ответ в этом посте. CharacterEncodingFilter не работает вместе с Spring Security 3.2.0, предоставленной @Christian Nilsson. По сути, мне нужно было зарегистрировать фильтр кодировки символов с помощью метода onStartup, а не обычного getServletFilters.

0 ответов

Другие вопросы по тегам