使用@NumberFormat的Thymeleaf-Spring BigDecimal格式添加了额外的符号

时间:2014-04-03 14:49:58

标签: spring-mvc datatables thymeleaf dandelion

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

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

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

因此,如果我添加三行,我会

  1. AA£22.00
  2. £22.00
  3. £22.00
  4. 价格字段是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" />

    并且字符编码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和数据表1.9.4

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

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

0 个答案:

没有答案