struts2 在jdk11环境下报404错误的问题解决

        首先说明一下,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错误了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值