java.util.Date的set方法與struts2類型轉換,關係似乎不大,但某些情況下,java.util.Date需要轉換才能被set,特別是在struts2使用下。
情況是這樣的,項目進入測試階段,一個bug讓我們很頭疼。頁面上my97日期外掛程式選擇的日期,在MAC系統中FF下,傳到後台無法被set(其他系統其他瀏覽器正常。。。)。研究時發現,伺服器報的異常是找不到該屬性的setBirthday([Ljava.Lang.String birthday),但實際上,birthday定義的是java.util.Date。
/** * 生日 */private java.util.Date birthday;public java.util.Date getBirthday() {return birthday;}public void setBirthday(java.util.Date birthday) {this.birthday = birthday;}
無奈之下,就寫了一個Stirng類型的set方法
public void setBirthday(String birthday) {Date date = null;if(!StringUtils.isEmpty(birthday)){try {date = DateUtil.convertStringToDate(birthday);} catch (ParseException e) {e.printStackTrace();}}this.birthday = d1;}
如此,MAC機FF訪問windows開發機,正常。問題在後面,待部署到測試機(linux),又說找不到setBirthday(String)。。。不可思議之下,將setBirthday(String)提到setBirthday(java.util.Date)之前,正常。
這個bug算是修複了,但總覺得怪異。後面和同事聊起,說可能是struts2的資料轉換問題,單獨加上資料轉換(拿掉setBirthday(String)),確實正常,索性就把兩種解決方案都加上。
#DateConverterjava.util.Date=org.abc.commons.util.DateTypeConverter
xwork-conversion.properties,放於src目錄下。
public class DateTypeConverter extends DefaultTypeConverter {@Overridepublic Object convertValue(Map context, Object value, Class toType) {SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");if (toType == Date.class) { // 瀏覽器向伺服器提交時,進行String to Date的轉換Date date=null;String dateString = null;String[] params = (String[]) value;dateString = params[0];// 擷取日期的字串 try {date=simpleDateFormat.parse(dateString);// 遍曆日期支援格式,進行轉換return date;} catch (Exception e) {}return null;}else if (toType == String.class) { // 伺服器向瀏覽器輸出時,進行Date to String的類型轉換Date date = (Date) value;return new SimpleDateFormat("yyyy-MM-dd").format(date);// 輸出的格式是yyyy-MM-dd}return null;}}
此處也可以看到,struts2是以數組接受參數的,上面的([Ljava.Lang.String birthday)也就不難理解。
struts2資料轉換器可參見:http://www.cnblogs.com/lpshou/archive/2012/11/27/2791188.html