ssh框架中 hibernate 的bean中 的java.math.BigDecimal 要改成 integer 或者 long
但是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
* 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框架中 hibernate 的bean中 的java.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
Java中的SSH框架之struts2
SSH:struts2+spring+hibernate,三個框架整合在一起。 首先,為專案增加struts2框架: 1、首先需要使用IDE建立一個web project,我使用的是myeclipse6.5 2、引入struts2的jar包。 在網上