web開發時java.lang.IllegalArgumentException: argument type mismatch異常及解決方法
嚴重:Servlet.service() for servlet action threw exception
java.lang.IllegalArgumentException:argument type mismatch這個異常,我查看了一下程式碼,發現程式碼並沒有錯誤,但為什麼會爆這個錯誤呢?原來是應為引數型別不匹配二出現的錯誤,所以只要改正引數型別就行了,出現這種異常的原因是:Struts框架中的ActionForm,主要有三大作用:給屬性賦值,自動轉型和資料的驗證。其中,在資料型別的自動轉換中,簡化了程式設計師的程式碼量,但是,以Struts 1.2為例:ActionForm對java.util.Date型別的資料(但是預設有java.sql.Date)沒提供轉型。
下面說幾種我在出現這種異常時,常用的幾種解決方法:
方法一:Form中的日期型別使用String型別,在Action中自己處理型別轉換(即在Action中對Form->POJO轉換時手工處理)。
方法二:Form中使用java.util.Date型別,自定義一個日期轉換類DateConverter(需要實現Converter介面),然後在自定義的ActionServlet或者Action基類中註冊DateConverter:ConvertUtils.register(newDateConverter(), Date.class)。
方法二具體處理辦法:
1.先申明一個轉換類
package yg.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
importorg.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.Converter;
public class UtilDateConverter implementsConverter {
@Override
public Object convert(Class type, Object value) {
// TODO Auto-generated method stub
System.out.println("UtilDateConverter.value=" + value);
if (value == null) {
return value;
}
if (value instanceof Date) {
return value;
}
Date d=null;
if (value instanceof String) {
SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd");
try {
d = sdf.parse((String)value);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return d;
}
}
2.再使伺服器啟動設使給類註冊進去
方法1.使用servlet註冊
package yg.util;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.beanutils.ConvertUtils;
/**
* 註冊java.util.date轉換器
* @author Administrator
*
*/
public class UtilDateConverterInitWithServlet
extendsHttpServlet {
@Override
public void init() throws ServletException {
System.out.println("UtilDateConverterInitWithServlet.init()");
ConvertUtils.register(new UtilDateConverter(), Date.class);
}
}
其中web.xml檔案加上
<servlet>
<servlet-name>UtilDateConverterInitWithServlet</servlet-name>
<servlet-class>com.bjsxt.struts.UtilDateConverterInitWithServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
方法2.使用struts中的plug-in進行註冊
package yg.util;
import java.util.Date;
import javax.servlet.ServletException;
importorg.apache.commons.beanutils.ConvertUtils;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public classUtilDateConverterInitWithPlugin implements PlugIn {
public void destroy() {
}
public void init(ActionServlet servlet,ModuleConfig config)
throws ServletException {
System.out.println("UtilDateConverterInitWithPlugin.init()");
ConvertUtils.register(new UtilDateConverter(), Date.class);
}
}
其中struts-config.xml檔案加上
<plug-inclassName="yg.util.UtilDateConverterInitWithPlugin"/>
用以上的方法基本就可以解決了