異常詳細資訊:

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頁面部分代碼(表單中)如下 :

<s:hidden name="goods.buydatetime"></s:hidden>
goods對應的實體類(部分getter,setter方法已省略):

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,見下圖:
原因到底是什麼呢?因為在火狐和谷歌浏覽器中沒問題啊
最後發現是ie浏覽器的語言環境是英文
把語言調整為中文就ok 了.
針對這個問題,我們沒法要求客戶一定設定中文為預設浏覽器的語言環境。因而對于date類型的轉換,可以自己定義一個轉換器。

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=你的類型轉換器的完整限定類名
xwork-conversion.properties 内容如下:

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