1. 程式人生 > >ssh框架中 hibernate 的bean中 的java.math.BigDecimal 要改成 integer 或者 long

ssh框架中 hibernate 的bean中 的java.math.BigDecimal 要改成 integer 或者 long

從oracle資料庫中的integer欄位通過hibernate的反向工程,生成的bean欄位為java.math.BigDecimal型別。
但是struts2框架中的xworks對從jsp頁面穿過來的bean物件不能對java.math.BigDecimal型別從string型別轉換到BigDecimal型別,但能轉換為integer和long型別。

因此要將BigDecimal型別改成integer和long型別。

或者通過配置 xworks 進行轉換。

內容如下:

專案中Struts2.1.6不支援基本資料型別的自動轉換,專案繼而採用Struts2.1.8支援資料型別的基本原始資料型別的自動轉換。主要原因在:XWork的版本原來xwork2.1.3 提供為xwork2.16 版本:

下面程式碼為xwork2.16版本的原始碼:

* <p/>
 * XWork will automatically handle the most common type conversion for you. This includes support for converting to
 * and from Strings for each of the following:
 * <p/>
 * <ul>
 * <li>String</li>
 * <li>boolean / Boolean</li>
 * <li>char / Character</li>


 * <li>int / Integer, float / Float, long / Long, double / Double</li>
 * <li>dates - uses the SHORT format for the Locale associated with the current request</li>
 * <li>arrays - assuming the individual strings can be coverted to the individual items</li>
 * <li>collections
- if not object type can be determined, it is assumed to be a String and a new ArrayList is
 * created</li>
 * </ul>
 * <p/> Note that with arrays the type conversion will defer to the type of the array elements and try to convert each
 * item individually. As with any other type conversion, if the conversion can't be performed the standard type
 * conversion error reporting is used to indicate a problem occured while processing the type conversion.
 * <p/>

public class XWorkBasicConverter extends DefaultTypeConverter :

//轉換器的重點轉換的方面如下:

 @Override
    public Object convertValue(Map<String, Object> context, Object o, Member member, String s, Object value, Class toType) {
        Object result = null;

        if (value == null || toType.isAssignableFrom(value.getClass())) {
            // no need to convert at all, right?
            return value;
        }

        if (toType == String.class) {
            /* the code below has been disabled as it causes sideffects in Struts2 (XW-512)
            // if input (value) is a number then use special conversion method (XW-490)
            Class inputType = value.getClass();
            if (Number.class.isAssignableFrom(inputType)) {
                result = doConvertFromNumberToString(context, value, inputType);
                if (result != null) {
                    return result;
                }
            }*/
            // okay use default string conversion
            result = doConvertToString(context, value);
        } else if (toType == boolean.class) {
            result = doConvertToBoolean(value);
        } else if (toType == Boolean.class) {
            result = doConvertToBoolean(value);
        } else if (toType.isArray()) {
            result = doConvertToArray(context, o, member, s, value, toType);
        } else if (Date.class.isAssignableFrom(toType)) {
            result = doConvertToDate(context, value, toType);
        } else if (Calendar.class.isAssignableFrom(toType)) {
            Date dateResult = (Date) doConvertToDate(context, value, Date.class);
            if (dateResult != null) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(dateResult);
                result = calendar;
            }
        } else if (Collection.class.isAssignableFrom(toType)) {
            result = doConvertToCollection(context, o, member, s, value, toType);
        } else if (toType == Character.class) {
            result = doConvertToCharacter(value);
        } else if (toType == char.class) {
            result = doConvertToCharacter(value);
        } else if (Number.class.isAssignableFrom(toType) || toType.isPrimitive()) {
            result = doConvertToNumber(context, value, toType);
        } else if (toType == Class.class) {
            result = doConvertToClass(value);
        }

        if (result == null) {
            if (value instanceof Object[]) {
                Object[] array = (Object[]) value;

                if (array.length >= 1) {
                    value = array[0];
                } else {
                    value = null;
                }

                // let's try to convert the first element only
                result = convertValue(context, o, member, s, value, toType);
            } else if (!"".equals(value)) { // we've already tried the types we know
                result = super.convertValue(context, value, toType);
            }

            if (result == null && value != null && !"".equals(value)) {
                throw new XWorkException("Cannot create type " + toType + " from value " + value);
            }
        }

        return result;
    }

// 其中的一個數字型別的轉換:有此可以看出支援紅色的部分的哦:^_^

    private Object doConvertToNumber(Map<String, Object> context, Object value, Class toType) {
        if (value instanceof String) {
            if (toType == BigDecimal.class) {
                return new BigDecimal((String) value);
            } else if (toType == BigInteger.class) {
                return new BigInteger((String) value);
            } else if (toType.isPrimitive()) {
                Object convertedValue = super.convertValue(context, value, toType);
                String stringValue = (String) value;
                if (!isInRange((Number)convertedValue, stringValue,  toType))
                        throw new XWorkException("Overflow or underflow casting: \"" + stringValue + "\" into class " + convertedValue.getClass().getName());

                return convertedValue;
            } else {
                String stringValue = (String) value;
                if (!toType.isPrimitive() && (stringValue == null || stringValue.length() == 0)) {
                    return null;
                }
                NumberFormat numFormat = NumberFormat.getInstance(getLocale(context));
                ParsePosition parsePos = new ParsePosition(0);
                if (isIntegerType(toType)) {
                    numFormat.setParseIntegerOnly(true);
                }
                numFormat.setGroupingUsed(true);
                Number number = numFormat.parse(stringValue, parsePos);

                if (parsePos.getIndex() != stringValue.length()) {
                    throw new XWorkException("Unparseable number: \"" + stringValue + "\" at position "
                            + parsePos.getIndex());
                } else {
                    if (!isInRange(number, stringValue,  toType))
                        throw new XWorkException("Overflow or underflow casting: \"" + stringValue + "\" into class " + number.getClass().getName());
                   
                    value = super.convertValue(context, number, toType);
                }
            }
        } else if (value instanceof Object[]) {
            Object[] objArray = (Object[]) value;

            if (objArray.length == 1) {
                return doConvertToNumber(context, objArray[0], toType);
            }
        }

        // pass it through DefaultTypeConverter
        return super.convertValue(context, value, toType);
    }

//時間型別的轉換:

 private Object doConvertToDate(Map<String, Object> context, Object value, Class toType) {
        Date result = null;

        if (value instanceof String && value != null && ((String) value).length() > 0) {
            String sa = (String) value;
            Locale locale = getLocale(context);

            DateFormat df = null;
            if (java.sql.Time.class == toType) {
                df = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
            } else if (java.sql.Timestamp.class == toType) {
                Date check = null;

                //支援的格式
                SimpleDateFormat dtfmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT,
                        DateFormat.MEDIUM,
                        locale);
                SimpleDateFormat fullfmt = new SimpleDateFormat(dtfmt.toPattern() + MILLISECOND_FORMAT,
                        locale);

                SimpleDateFormat dfmt = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT,
                        locale);

                SimpleDateFormat[] fmts = {fullfmt, dtfmt, dfmt};
                for (SimpleDateFormat fmt : fmts) {
                    try {
                        check = fmt.parse(sa);
                        df = fmt;
                        if (check != null) {
                            break;
                        }
                    } catch (ParseException ignore) {
                    }
                }
            } else if (java.util.Date.class == toType) {
                Date check = null;
                DateFormat[] dfs = getDateFormats(locale);
                for (DateFormat df1 : dfs) {
                    try {
                        check = df1.parse(sa);
                        df = df1;
                        if (check != null) {
                            break;
                        }
                    }
                    catch (ParseException ignore) {
                    }
                }
            }
            //final fallback for dates without time
            if (df == null) {
                df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
            }
            try {
                df.setLenient(false); // let's use strict parsing (XW-341)
                result = df.parse(sa);
                if (!(Date.class == toType)) {
                    try {
                        Constructor constructor = toType.getConstructor(new Class[]{long.class});
                        return constructor.newInstance(new Object[]{Long.valueOf(result.getTime())});
                    } catch (Exception e) {
                        throw new XWorkException("Couldn't create class " + toType + " using default (long) constructor", e);
                    }
                }
            } catch (ParseException e) {
                throw new XWorkException("Could not parse date", e);
            }
        } else if (Date.class.isAssignableFrom(value.getClass())) {
            result = (Date) value;
        }
        return result;
    }

//Struts2.0可以格式化的幾種型別:

    private DateFormat[] getDateFormats(Locale locale) {
        DateFormat dt1 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, locale);
        DateFormat dt2 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
        DateFormat dt3 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);

        DateFormat d1 = DateFormat.getDateInstance(DateFormat.SHORT, locale);
        DateFormat d2 = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
        DateFormat d3 = DateFormat.getDateInstance(DateFormat.LONG, locale);

        DateFormat rfc3399 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

        DateFormat[] dfs = {dt1, dt2, dt3, rfc3399, d1, d2, d3}; //added RFC 3339 date format (XW-473)
        return dfs;
    }


相關推薦

ssh框架 hibernatebeanjava.math.BigDecimal integer 或者 long

從oracle資料庫中的integer欄位通過hibernate的反向工程,生成的bean欄位為java.math.BigDecimal型別。 但是struts2框架中的xworks對從jsp頁面穿過來的bean物件不能對java.math.BigDecimal型別從str

SSH框架Hibernate的集合快取、查詢快取、專案的session管理方式

一、集合快取 1、不使用集合快取: 2、使用集合快取: 1)配置hibernate.cfg.xml 2)測試: 二、補充二級快取、集合快取配置 三、查詢快取 list()

SSH框架Hibernate的關聯對映之一對多、多對一對映

關聯對映之一對多、多對一對映 一、需求: 部門與員工 一個部門有多個員工 【一對多】 多個員工,屬於一個部門 【多對一】 二、邏輯分析: 三、程式碼實現 1、javabean及對映檔案的配置: 1)Employee.java、Employ

SSH框架Hibernate資料庫外來鍵如何插入值的問題

package com.teacher.web.action; import java.util.Date; import com.pojos.Course_information; import com.pojos.Teacher_information; import com.teacher.comm.B

Java.math.BigDecimal

叠代 實現 class color 小數 兩種 操作 rabl strong java.math.BigDecimal 類提供用於算術,刻度操作,舍入,比較,哈希算法和格式轉換操作。 toString()方法提供BigDecimal的規範表示。它使用戶可以完全控制舍入行為。

java.math.BigDecimal cannot be cast to java.lang.String

bigdecimal BigDecimal表示一個大整數,一般情況下很多整型都有個最大值的,但是有時候我們需要處理一些超過這個最大值的值,這個時候就出現了BigDecimal這樣的類用於表達大數值,這個錯誤應該是類型轉換過程中出現了問題.數據從數據庫中取出的,把數據庫中的整數轉成了BigDecimal 類型

Java報錯:java.math.BigDecimal cannot be cast to java.lang.String

從資料庫取count、sum等函式的值需要轉化成Integer的時候出現 java.math.BigDecimal cannot be cast to java.lang.String的報錯 錯誤程式碼: Integer.parseInt((String)map.get("id"

tomcat java.math.BigDecimal cannot be cast to java.lang.Double

將資料庫中數值型取出儲存到 map<String,Object>中,需要進行數值運算,轉成double型別時丟擲ava.math.BigDecimal cannot be cast to java.lang.Double 解決辦法; 1.轉成string String num

java.math.BinInteger和java.math.BigDecimal

import java.math.BigDecimal; /** * @author Jstar */ public class Arith { // 預設除法運算精度 private static final int DEF_DIV_SCALE = 1

關於 java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String

今天遇到了這個異常,其實是自己經驗欠缺所致。我是通過mybatis查詢到資料庫傳過來的主鍵,是一個32位的char型別。 程式碼: //查詢總賬表的該組織總賬記錄,包括該條記錄的主鍵id、賬戶餘額DzzZzb zzbInfo = null;Map map = (Map) IbatisSQL.selectO

03-java.lang.Math+java.util.Random+java.math.BigDecimal

一、java.lang.Math 1、概述 (1)public final class Math:不能被繼承,即沒有子類 (2)Math類包含用於執行基本數學運算的方法,其中的方法都是靜態的 -- 工具類 2、欄位 (1)static final double E:

java.math.BigDecimal類multiply的使用

public class Arith {/** * 提供精確加法計算的add方法 * @param value1 被加數 * @param value2 加數 * @return 兩個引數的和 */public static double add(double value1,double value2){Bi

java.math BigDecimal

雙精度浮點型變數double可以處理16位有效數,但是超過16位後呢,要用什麼來表示呢?double在做算術運算時,會出現一定的偏差,如果在一般的情況下使用倒是可以, 但如果在商業領域,如:銀行業務利息計算,商場交易等。 可能會出現不好處理的問題。System.out.pri

Elasticsearch - cannot write xcontent for unknown value of type class java.math.BigDecimal

博文 helper rac ria long client 客戶端 last stringbu 問題與分析 在使用Elasticsearch進行index數據時,發現報錯如下: java.lang.IllegalArgumentException: cannot write

為什麼Java內部類設計靜態和非靜態兩種

作者:Paranoid 連結:https://www.zhihu.com/question/28197253/answer/365692360 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。   首先,我們需要明白,為什麼要設計Java內部

Java中將毫秒數相應的年月日格式

time = file.lastModified();//獲取檔案的最後修改時間,格式為毫秒數 Date date = new Date(time); SimpleDateFormat sdf = ne

SSH框架hibernate 出現 user is not mapped 問題

eat and lis pub dao col 自己 return alc SSH框架中hibernate 出現 user is not mapped 問題 在做SSH框架整合時,在進行DAO操作時。這裏就只調用了chekUser()方法。運行時報 us

java 單例模式及在SSH框架運用

定義: 確保某一個類只有一個例項,而且自動例項化並向整個系統提供這個例項。 程式碼: Singleton類稱為單例類,通過使用private的建構函式確保了在一個應用中只產生一個例項,並且是自行例項化的。 Java程式碼   /**   * 執行緒安全的

java web 專案 ssh框架使用的 ClassNotFoundException 異常【找不到**Action】

對 visitAction 類進行了註解配置, 但是在訪問 visitAction 的時候,一直出現下面這個異常提示: 22:23:35,387 ERROR DefaultDispatcherErrorHandler:42 - Exception occurred dur

JavaSSH框架之struts2

SSH:struts2+spring+hibernate,三個框架整合在一起。 首先,為專案增加struts2框架: 1、首先需要使用IDE建立一個web project,我使用的是myeclipse6.5 2、引入struts2的jar包。 在網上