2

我正在使用 Thymeleaf 2.1.2.RELEASE 和 Spring MVC 4.0.4.RELEASE

我有一个动态表单,用于向订单添加新订单行。

我面临的问题是,每次我添加一行并重新渲染内容时,都会在前面每行的价格列上的货币符号之前添加一个额外的符号。

所以如果我添加三行我得到

  1. 22.00 英镑
  2. 22.00 英镑
  3. 22.00 英镑

价格字段是带有 @NumberFormat(style = NumberFormat.Style.CURRENCY) 的 BigDecimal,因此 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页面aleady包括

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

并且字符编码servlet过滤器设置如下

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

除此之外,使用 Fiddler 我可以看到蒲公英数据表 ajax 请求的响应标头被错误地编码为 ISO-88591。我正在使用 datatables-thymeleaf 0.93 和 datatables 1.9.4

如果我将 thymeleaf 编码、spring servlet 过滤器和 html 元标记设置为 ISO-88591 进行实验,那么货币符号会正确呈现,尽管我希望它可以与 UTF-8 一起使用

最终我在这篇文章CharacterEncodingFilter don't work with Spring Security 3.2.0 by @Christian Nilsson 中找到了答案。基本上我需要强制使用 onStartup 方法而不是通常的 getServletFilters 注册字符编码过滤器。

4

0 回答 0