SpringMVC中自定义绑定BigDecimal类型数据的CustomEditor
问题:
在使用Spring的SimpleFormController的formBackingObject方法绑定待编辑表单内容时,对于BigDecimal类型的数据Spring绑定会报错,原因是表单域中的String类型数据无法转换为Bean中的BigDecimal
解决办法:
自定义一个特定类型的绑定类,在Controller中的initBinder方法中注册特定类型绑定方法,Spring在碰到此类型的数据时就会使用其转换数据类型
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { CustomBigDecimalEditor bigDecimalEditor = new CustomBigDecimalEditor(); binder.registerCustomEditor(BigDecimal.class, bigDecimalEditor); super.initBinder(request, binder); }
/** * 类说明: BigDecimal custom property editor<br> * 创建时间: 2008-2-26 下午03:15:03<br> * * @author Seraph<br> * @email: [email protected]<br> */ public class CustomBigDecimalEditor extends PropertyEditorSupport { public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { // Treat empty String as null value. setValue(null); } else { setValue(NumberUtils.getBigDecimal(text)); } } }
/** * 类说明: Number handle utils<br> * 创建时间: 2007-10-4 下午05:08:48<br> * * @author Seraph<br> * @email: [email protected]<br> */ public class NumberUtils { public static int parseInt(long l){ return BigDecimal.valueOf(l).intValue(); } public static long parseLong(String s) { return Long.parseLong(s.trim()); } public static BigDecimal getBigDecimal(String s) { return BigDecimal.valueOf(Long.parseLong(s.trim())); } }