環境:org.apache.commons.beanutils的版本號爲1.8.3
註冊時間轉換器代碼如下:
org.apache.commons.beanutils.converters.DateConverter dateConverter = new org.apache.commons.beanutils.converters.DateConverter();
dateConverter.setUseLocaleFormat(true);
dateConverter.setPatterns(new String[]{Constants.CONTEXT_KEY_FORMAT_DATE_VALUE, Constants.CONTEXT_KEY_FORMAT_DATETIME_VALUE});
ConvertUtils.register(dateConverter, Date.class);
當提交的時間沒有值的時候,會報出org.apache.commons.beanutils.ConversionException: No value specified for 'Date'錯誤,查看了apache源代碼,發現原因是因爲org.apache.commons.beanutils.converters.DateConverter轉換String爲Date時,發現是空值,即報出錯誤,源代碼如下
org.apache.commons.beanutils.converters.DateTimeConverter類第321行開始
String stringValue = value.toString().trim();
if (stringValue.length() == 0) {
return handleMissing(targetType);
}
解決方案:
自己寫個日期轉換類,由於org.apache.commons.beanutils.converters.DateConverter類被標記爲final,不可繼承,所以繼承DateConverter的父類DateTimeConverter,類的內容是在org.apache.commons.beanutils.converters.DateConverter內容上增加了對convertToType方法的重載,完整代碼如下
package com.lmiky.jdp.base.converter;
import java.util.Date;
import org.apache.commons.beanutils.converters.DateTimeConverter;
/**
* 日期轉換器
* @author lmiky
* @date 2014-1-26
*/
public class DateConverter extends DateTimeConverter {
public DateConverter() {
}
public DateConverter(Object defaultValue) {
super(defaultValue);
}
/* (non-Javadoc)
* @see org.apache.commons.beanutils.converters.AbstractConverter#getDefaultType()
*/
@SuppressWarnings("rawtypes")
protected Class getDefaultType() {
return Date.class;
}
/*
* (non-Javadoc)
* @see org.apache.commons.beanutils.converters.DateTimeConverter#convertToType(java.lang.Class, java.lang.Object)
*/
@SuppressWarnings("rawtypes")
@Override
protected Object convertToType(Class arg0, Object arg1) throws Exception {
if (arg1 == null) {
return null;
}
String value = arg1.toString().trim();
if (value.length() == 0) {
return null;
}
return super.convertToType(arg0, arg1);
}
}