SpEL(@NumberFormat)无效

use*_*069 4 java spring annotations spring-mvc spring-el

---- SampleVO

@NumberFormat(pattern = "###,##0")
private int money=100000;
Run Code Online (Sandbox Code Playgroud)

-----控制器

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

    model.addAttribute("sampleVO", sampleVO);

    return "sampleResult";
}
Run Code Online (Sandbox Code Playgroud)

------- sampleResult.jsp

money: <spring:eval expression="sampleVO.money"/>
Run Code Online (Sandbox Code Playgroud)

- - -期望

money : 100,000
Run Code Online (Sandbox Code Playgroud)

------但是,结果是

money : 100000
Run Code Online (Sandbox Code Playgroud)

问题是什么?我该怎么办?

Sea*_*oyd 5

@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);
}
Run Code Online (Sandbox Code Playgroud)

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

更新:(请参阅注释)您还需要添加<mvc:annotation-driven>到context.xml.