SpEL (@NumberFormat) 不起作用

发布于 2024-12-01 09:19:28 字数 610 浏览 1 评论 0原文

----SampleVO

@NumberFormat(pattern = "###,##0")
private int money=100000;

-----controller

@RequestMapping(value="/com/spelSample.do")
public String spelSample(SampleVO sampleVO,  Model model){

    model.addAttribute("sampleVO", sampleVO);

    return "sampleResult";
}

-------sampleResult.jsp

money: <spring:eval expression="sampleVO.money"/>

-----expectation

money : 100,000

------但是,result是

money : 100000

什么问题呢? 我应该怎么办?

----SampleVO

@NumberFormat(pattern = "###,##0")
private int money=100000;

-----controller

@RequestMapping(value="/com/spelSample.do")
public String spelSample(SampleVO sampleVO,  Model model){

    model.addAttribute("sampleVO", sampleVO);

    return "sampleResult";
}

-------sampleResult.jsp

money: <spring:eval expression="sampleVO.money"/>

-----expectation

money : 100,000

------but, result is

money : 100000

what is the problem?
what should i do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吃不饱 2024-12-08 09:19:28

来自 @NumberFormat 文档

声明字段应格式化为数字。支持
按样式或自定义模式字符串进行格式化。 可以应用于任何
JDK java.lang.Number 类型
.

您正在原始字段上使用它。显然这没有被涵盖。使用Integer 而不是int

编辑:更准确地说,并没有涵盖 java.lang.Number 的每个可能的子类。以下是 NumberFormatAnnotationFormatterFactory

public NumberFormatAnnotationFormatterFactory() {
    Set<Class<?>> rawFieldTypes = new HashSet<Class<?>>(7);
    rawFieldTypes.add(Short.class);
    rawFieldTypes.add(Integer.class);
    rawFieldTypes.add(Long.class);
    rawFieldTypes.add(Float.class);
    rawFieldTypes.add(Double.class);
    rawFieldTypes.add(BigDecimal.class);
    rawFieldTypes.add(BigInteger.class);
    this.fieldTypes = Collections.unmodifiableSet(rawFieldTypes);
}

这意味着缺少并发 api 中的 Atomic* 类,以及 Commons/Lang 等框架中的所有自定义 Number 实现。

更新:(参见注释)您还需要添加 到您的 context.xml。

From the @NumberFormat docs:

Declares that a field should be formatted as a number. Supports
formatting by style or custom pattern string. Can be applied to any
JDK java.lang.Number type
.

You are using it on a primitive field. Apparently that is not covered. Use Integer instead of int.

Edit: to be more precise, not every possible subclass of java.lang.Number is covered. Here is the relevant excerpt from NumberFormatAnnotationFormatterFactory:

public NumberFormatAnnotationFormatterFactory() {
    Set<Class<?>> rawFieldTypes = new HashSet<Class<?>>(7);
    rawFieldTypes.add(Short.class);
    rawFieldTypes.add(Integer.class);
    rawFieldTypes.add(Long.class);
    rawFieldTypes.add(Float.class);
    rawFieldTypes.add(Double.class);
    rawFieldTypes.add(BigDecimal.class);
    rawFieldTypes.add(BigInteger.class);
    this.fieldTypes = Collections.unmodifiableSet(rawFieldTypes);
}

This means the Atomic* classes from the concurrent api are missing, as well as all custom Number implementations from frameworks like Commons/Lang etc.

Update: (see comments) you also need to add <mvc:annotation-driven> to your context.xml.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文