1. 程式人生 > >web開發時java.lang.IllegalArgumentException: argument type mismatch異常及解決方法

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"/>

用以上的方法基本就可以解決了