升级Struts2到2.5.26后如何在JSP页面获取BigDecimal完整十进制值
解决方案
问题原因
该问题是Struts2 2.5.x版本对BigDecimal类型的默认转换逻辑调整导致的:
- 旧版本Struts2会保留BigDecimal原始的小数位输出
- 2.5.x版本的默认BigDecimal转换器会自动裁剪尾部无意义的0,同时textfield标签的内置数字格式化逻辑存在兼容问题,识别不到BigDecimal的小数位时就会出现
undefined后缀
具体解决方法
方案1:标签局部配置(适合仅个别字段需要保留固定小数位的场景)
- 修复
<s:property>标签输出问题:
直接在标签上添加format属性指定小数格式,示例代码:
<s:property value="%{account.totAmt}" format="0.0000" />
- 修复
<s:textfield>标签输出问题:
通过getText方法手动格式化值后赋值给标签的value属性,示例代码:
<s:textfield id="price" name="account.totAmt" value="%{getText('{0,number,0.0000}', {account.totAmt})}" />
方案2:全局自定义转换器(适合所有BigDecimal字段都需要保留固定小数位的场景,一次配置解决两类问题)
- 编写自定义BigDecimal转换器类,继承Struts内置的BigDecimalConverter,重写字符串转换逻辑:
import java.math.BigDecimal; import java.util.Map; import com.opensymphony.xwork2.conversion.impl.BigDecimalConverter; public class CustomBigDecimalConverter extends BigDecimalConverter { @Override public String convertToString(Map context, Object value) { if (value instanceof BigDecimal) { // 按需求保留4位小数,使用toPlainString避免科学计数法 return ((BigDecimal) value).setScale(4, BigDecimal.ROUND_HALF_UP).toPlainString(); } return super.convertToString(context, value); } }
- 注册全局转换器:在项目的resources目录下新建
xwork-conversion.properties文件,添加如下配置(替换为你自己的转换器类全路径):
java.math.BigDecimal=com.yourcompany.yourproject.converter.CustomBigDecimalConverter
配置完成后重启项目,所有BigDecimal类型字段的输出都会保留4位小数,两类标签的显示问题会同时解决。
内容的提问来源于stack exchange,提问作者Mickey Patel
相关产品推荐
相关产品推荐

