Форматирование Thymeleaf-Spring BigDecimal с помощью @NumberFormat добавляет дополнительные символы
Я использую Thymeleaf 2.1.2.RELEASE с Spring MVC 4.0.4.RELEASE
У меня есть динамическая форма, которую я использую, чтобы добавить новые строки заказа в заказ.
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я добавляю строку и содержимое перерисовывается, добавляется дополнительный символ перед символом валюты в столбце цены каждой из предыдущих строк.
Так что, если я добавлю три строки, я получу
- ÂÂ £ 22.00
- Â £ 22.00
- £ 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.