2013年12月10日 星期二

【筆記】如何讓struts2 支援BigDecimal

Struts2 會對一些常用的型態,如 Integer、Double、String 等型態資料進行自動轉型。
不過常用的 BigDecimal 卻不在支援的型態中,導致JSP傳值至Action 時會發生型態轉換的Exception。

先建立負責轉換用的Bean
package common.util;
import java.math.BigDecimal;
import java.util.Map;  
import org.apache.struts2.util.StrutsTypeConverter;
 
public class BigDecimalConverter extends StrutsTypeConverter {
 
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        BigDecimal bd = null;
        if(BigDecimal.class ==toClass){
            String bdStr = values[0];
            if(bdStr!=null&&!"".equals(bdStr)){
                bd = new BigDecimal(bdStr);
            }else{
                //bd = BigDecimal.valueOf(-1);
            }
            return bd;
        }        
        return BigDecimal.ZERO;
    }
 
    @Override
    public String convertToString(Map context, Object o) {
         
        if(o instanceof BigDecimal){
            BigDecimal b = new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_DOWN);
            return b.toString();
        }        
        return o.toString();
    }
 
}  

然後再至xwork-conversion.properties 中加入一行敘述

java.math.BigDecimal=common.util.BigDecimalConverter