天天看點

date java.lang.IllegalArgumentException: argument type mismatch

異常詳細資訊:

date java.lang.IllegalArgumentException: argument type mismatch

11:23:30,113  warn  - error setting expression 'goods.buydatetime' with value '[ljava.lang.string;@109558d'  

ognl.methodfailedexception: method "setbuydatetime" failed for object goods [id=0, name=null, description=null] [java.lang.nosuchmethodexception: com.shop.jn.entity.goods.setbuydatetime([ljava.lang.string;)]  

    at ognl.ognlruntime.callappropriatemethod(ognlruntime.java:1289)  

    at ognl.ognlruntime.setmethodvalue(ognlruntime.java:1478)  

    at ognl.objectpropertyaccessor.setpossibleproperty(objectpropertyaccessor.java:85)  

    at ognl.objectpropertyaccessor.setproperty(objectpropertyaccessor.java:162)  

    at com.opensymphony.xwork2.ognl.accessor.objectaccessor.setproperty(objectaccessor.java:27)  

    at ognl.ognlruntime.setproperty(ognlruntime.java:2315)  

    at ognl.astproperty.setvaluebody(astproperty.java:127)  

    at ognl.simplenode.evaluatesetvaluebody(simplenode.java:220)  

    at ognl.simplenode.setvalue(simplenode.java:301)  

    at ognl.astchain.setvaluebody(astchain.java:227)  

    at ognl.ognl.setvalue(ognl.java:737)  

    at com.opensymphony.xwork2.ognl.ognlutil.setvalue(ognlutil.java:217)  

    at com.opensymphony.xwork2.ognl.ognlvaluestack.trysetvalue(ognlvaluestack.java:186)  

    at com.opensymphony.xwork2.ognl.ognlvaluestack.setvalue(ognlvaluestack.java:173)  

    at com.opensymphony.xwork2.ognl.ognlvaluestack.setparameter(ognlvaluestack.java:151)  

    at com.opensymphony.xwork2.interceptor.parametersinterceptor.setparameters(parametersinterceptor.java:317)  

    at com.opensymphony.xwork2.interceptor.parametersinterceptor.dointercept(parametersinterceptor.java:228)  

    at com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:98)  

    at com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249)  

    at com.opensymphony.xwork2.interceptor.parametersinterceptor.dointercept(parametersinterceptor.java:236)  

    at com.opensymphony.xwork2.interceptor.staticparametersinterceptor.intercept(staticparametersinterceptor.java:190)  

    at org.apache.struts2.interceptor.multiselectinterceptor.intercept(multiselectinterceptor.java:75)  

    at org.apache.struts2.interceptor.checkboxinterceptor.intercept(checkboxinterceptor.java:90)  

    at org.apache.struts2.interceptor.fileuploadinterceptor.intercept(fileuploadinterceptor.java:243)  

    at com.opensymphony.xwork2.interceptor.modeldriveninterceptor.intercept(modeldriveninterceptor.java:100)  

    at com.opensymphony.xwork2.interceptor.scopedmodeldriveninterceptor.intercept(scopedmodeldriveninterceptor.java:141)  

    at com.opensymphony.xwork2.interceptor.chaininginterceptor.intercept(chaininginterceptor.java:145)  

    at com.opensymphony.xwork2.interceptor.prepareinterceptor.dointercept(prepareinterceptor.java:171)  

    at com.opensymphony.xwork2.interceptor.i18ninterceptor.intercept(i18ninterceptor.java:176)  

    at org.apache.struts2.interceptor.servletconfiginterceptor.intercept(servletconfiginterceptor.java:164)  

    at com.opensymphony.xwork2.interceptor.aliasinterceptor.intercept(aliasinterceptor.java:192)  

    at com.opensymphony.xwork2.interceptor.exceptionmappinginterceptor.intercept(exceptionmappinginterceptor.java:187)  

    at org.apache.struts2.impl.strutsactionproxy.execute(strutsactionproxy.java:54)  

    at org.apache.struts2.dispatcher.dispatcher.serviceaction(dispatcher.java:511)  

    at org.apache.struts2.dispatcher.ng.executeoperations.executeaction(executeoperations.java:77)  

    at org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter.dofilter(strutsprepareandexecutefilter.java:91)  

    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:243)  

    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)  

    at org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:222)  

    at org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:123)  

    at org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:472)  

    at org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:171)  

    at org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:99)  

    at org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:953)  

    at org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)  

    at org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:408)  

    at org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1023)  

    at org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:589)  

    at org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:310)  

    at java.util.concurrent.threadpoolexecutor$worker.runtask(threadpoolexecutor.java:886)  

    at java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:908)  

    at java.lang.thread.run(thread.java:662)  

caused by: java.lang.nosuchmethodexception: com.shop.jn.entity.goods.setbuydatetime([ljava.lang.string;)  

    at ognl.ognlruntime.callappropriatemethod(ognlruntime.java:1230)  

    ... 68 more  

/-- encapsulated exception ------------\  

java.lang.nosuchmethodexception: com.shop.jn.entity.goods.setbuydatetime([ljava.lang.string;)  

\--------------------------------------/  

jsp頁面部分代碼(表單中)如下 :

date java.lang.IllegalArgumentException: argument type mismatch

<s:hidden name="goods.buydatetime"></s:hidden>  

 goods對應的實體類(部分getter,setter方法已省略):

date java.lang.IllegalArgumentException: argument type mismatch

package com.shop.jn.entity;  

import java.io.serializable;  

import java.util.date;  

/** 

 * entity:goods 

 * @author huangwei 

 * 

 */  

public class goods  implements serializable{  

    private static final long serialversionuid = 586940311263079808l;  

    private int id;  

    /** 

     * goods name 

     */  

    private string name;  

     * alias of goods 

    private string alias;  

     * when goods was brought 

    private date buydatetime;  

     * when this record was modified 

    private date latestmoddatetime;  

     * the price of goods 

    private double price;  

     * the detail of the goods 

    private string description;  

     * the supermarket the goods belong 

    private supermarket supermarket;  

    public int getid() {  

        return id;  

    }  

    public void setid(int id) {  

        this.id = id;  

    public string getname() {  

        return name;  

    public void setname(string name) {  

        this.name = name;  

    public string getalias() {  

        return alias;  

    public void setalias(string alias) {  

        this.alias = alias;  

    public date getlatestmoddatetime() {  

        return latestmoddatetime;  

    public void setlatestmoddatetime(date latestmoddatetime) {  

        this.latestmoddatetime = latestmoddatetime;  

    public date getbuydatetime() {  

        return buydatetime;  

    public void setbuydatetime(date buydatetime) {  

        system.out.println("buydatetime:"+buydatetime);  

        this.buydatetime=buydatetime;  

}  

 實體類中buydatetime 的類型是java.util.date

使用ie浏覽器有問題,但是使用google浏覽器沒問題。

ie的locale是en_us,見下圖:

date java.lang.IllegalArgumentException: argument type mismatch

原因到底是什麼呢?因為在火狐和谷歌浏覽器中沒問題啊

最後發現是ie浏覽器的語言環境是英文

 把語言調整為中文就ok 了.

date java.lang.IllegalArgumentException: argument type mismatch

針對這個問題,我們沒法要求客戶一定設定中文為預設浏覽器的語言環境。因而對于date類型的轉換,可以自己定義一個轉換器。

date java.lang.IllegalArgumentException: argument type mismatch

package com.common.convert;  

import java.sql.date;  

import java.sql.timestamp;  

import java.text.parseexception;  

import java.text.simpledateformat;  

import java.util.map;  

import ognl.defaulttypeconverter;  

import org.apache.commons.lang.stringutils;  

import org.apache.commons.lang3.time.dateutils;  

import org.apache.log4j.logger;  

/*** 

 * 日期轉換器.<br>用于struts2 

 *  

public class dateconverter extends defaulttypeconverter {  

    private static final logger logger = logger.getlogger(dateconverter.class);  

    private static final string datetime_pattern = "yyyy-mm-dd hh:mm:ss";  

    private static final string datetime_pattern_no_second = "yyyy-mm-dd hh:mm";  

    private static final string datetime_pattern_zh ="yyyy年mm月dd日 hh點mm分ss秒";  

    private static final string datetime_pattern_zh2 ="yyyy年mm月dd日 hh時mm分ss秒";  

    private static final string date_pattern = "yyyy-mm-dd";  

    private static final string month_pattern = "yyyy-mm";  

     * convert value between types 

    @suppresswarnings("unchecked")  

    public object convertvalue(map ognlcontext, object value, class totype) {  

        object result = null;  

        // java.sql.date 是java.util.date 的子類  

        if (totype == java.util.date.class) {  

            try {  

                result = doconverttodate(value,  totype);  

            } catch (parseexception e) {  

                e.printstacktrace();  

            }  

        } else if (totype == java.sql.timestamp.class) {  

                java.util.date date=doconverttodate(value, totype);  

                result = new timestamp(date.gettime());  

        } else if (totype == string.class) {  

            result = doconverttostring(value);  

        }  

        return result;  

     * convert string to date 

     *  

     * @param value 

     * @return 

     * @throws parseexception 

    private java.util.date doconverttodate(object value,class totype) throws parseexception {  

        java.util.date result = null;  

        if (value instanceof string) {  

            result = dateutils.parsedate((string) value, new string[] {datetime_pattern,  

                    date_pattern,  month_pattern   

                    ,datetime_pattern_no_second,datetime_pattern_zh,datetime_pattern_zh2});  

//          if(totype==java.sql.timestamp.class){  

//              result=new java.sql.timestamp(result.gettime());  

//          }  

            // all patterns failed, try a milliseconds constructor  

            if (result == null && stringutils.isnotempty((string) value)) {  

                try {  

                    result = new date(new long((string) value).longvalue());  

                } catch (exception e) {  

                    logger.error("converting from milliseconds to date fails!");  

                    e.printstacktrace();  

                }  

        } else if (value instanceof object[]) {  

            // let's try to convert the first element only  

            object[] array = (object[]) value;  

            if ((array != null) && (array.length >= 1)) {  

                value = array[0];  

                result = doconverttodate(value,totype);  

        } else if (date.class.isassignablefrom(value.getclass())) {  

            result = (date) value;  

        return (java.util.date)result;  

     * convert date to string 

    private string doconverttostring(object value) {  

        simpledateformat simpledateformat = new simpledateformat(  

                datetime_pattern);  

        string result = (string)value;  

        if (value instanceof date) {  

            result = simpledateformat.format(value);  

 可以将該轉換器注冊為全局的:在classpath下建立xwork-conversion.properties檔案,内容為:java.util.date=你的類型轉換器的完整限定類名

date java.lang.IllegalArgumentException: argument type mismatch

 xwork-conversion.properties 内容如下:

date java.lang.IllegalArgumentException: argument type mismatch

java.util.date=com.common.convert.dateconverter  

java.sql.timestamp=com.common.convert.dateconverter