首先说明一下,struts2报404的情况很多,不一定你的问题和我的问题一样。要先判断是不是同一个问题。
我这里的struts2版本是2.5.18。struts2报404,是因为日期格式参数在jdk11环境下解析失败。
假如你在前台有一个日期参数A,A格式是字符串的日期,如“2021-05-01 00:00:00”,然后对应后台接收的参数不是String,而是Timestamp,那这时候struts2就需要进行类型转换。
struts2中,默认解析日期格式参数的类是DateConverter
DateConverter这样解析日期格式,导致不同环境下所能解析的格式都不一样
在jdk8中,locate.CHINA环境下,三个日期格式分别是
dtfmt : yy-M-d H:mm:ss
fullfmt : yy-M-d H:mm:ss.SSS
dfmt : yy-M-d
但是到了jdk11,三个日期格式变成了
y/M/d ah:mm:ss
y/M/d ah:mm:ss.SSS
y/M/d
这样就造成jdk8可以正常解析的日期,到了jdk11就不能解析了。
所幸,struts2中预留了自定义日期格式解析的入口,只要我们自己重新实现日期格式解析,就能解决这个问题了。
附上解决方案
1.在项目中新增一个类MyDateTypeConverter,继承StrutsTypeConverter,补充上yyyy-MM-dd HH:mm:ss格式的日期解析就可以了
public class MyDateTypeConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map paramMap, String[] paramArrayOfString,
Class paramClass) {
DateFormat df = null;
Locale locale = getLocale(paramMap);
String sa = paramArrayOfString[0];
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date check = null;
SimpleDateFormat dtfmt = (SimpleDateFormat)DateFormat.getDateTimeInstance(3, 2, locale);
SimpleDateFormat fullfmt = new SimpleDateFormat(dtfmt.toPattern() + MILLISECOND_FORMAT, locale);
SimpleDateFormat dfmt = (SimpleDateFormat)DateFormat.getDateInstance(3, locale);
SimpleDateFormat[] fmts = { sdf,fullfmt, dtfmt, dfmt };
for (SimpleDateFormat fmt : fmts) {
try {
check = fmt.parse(sa);
df = fmt;
if (check != null) {
break;
}
} catch (ParseException parseException) {}
}
if(df!=null){
try {
Date result = df.parse(sa);
if (Date.class != paramClass) {
try {
Constructor constructor = paramClass.getConstructor(new Class[] { long.class });
return constructor.newInstance(new Object[] { Long.valueOf(result.getTime()) });
} catch (Exception e) {
}
}else{
return result;
}
} catch (ParseException e) {
}
}
return null;
}
@Override
public String convertToString(Map paramMap, Object paramObject) {
// TODO Auto-generated method stub
return null;
}
}
2.在项目classpath下,创建一个配置文件xwork-conversion.properties,内容写上
java.util.Date=com.xxx.xxx.MyDateTypeConverter
这样就不会再报404错误了