上一篇
📢 最新动态
2025年8月,仍有不少开发者被Struts2框架中日期类型存入Oracle时出现的"离奇异常"困扰——明明前端选择的是"2025-08-15",存入数据库却变成了"15-8月-25"或者直接报错!别急,经过多次实战验证的方案来了!
当你使用Struts2的<s:date>
标签或表单提交日期时,可能会遇到:
ORA-01843: 无效的月份
等错误 💥 根本原因:
DATE
类型格式不兼容 <!-- 使用HTML5日期输入 + Struts2标签 --> <s:form action="saveData"> <input type="date" name="userBirthday" value="<s:date name='userBirthday' format='yyyy-MM-dd'/>"> <s:submit value="提交"/> </s:form>
💡 关键点:强制指定yyyy-MM-dd
格式避免浏览器差异
在struts.xml
中添加:
<constant name="struts.date.format" value="yyyy-MM-dd"/> <constant name="struts.i18n.encoding" value="UTF-8"/>
🚨 注意:必须与Oracle的NLS_DATE_FORMAT
保持一致
执行SQL前先设置会话格式:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
或永久修改(需DBA权限):
ALTER SYSTEM SET NLS_DATE_FORMAT='YYYY-MM-DD' SCOPE=SPFILE;
在Action类中添加类型转换:
@TypeConversion(converter = "org.apache.struts2.util.StrutsTypeConverter") public Object convertFromString(Map context, String[] values, Class toClass) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.parse(values[0]); }
jdbc.url
后追加?loggerLevel=ALL
查看详细SQL日志 TO_CHAR(sysdate, 'YYYY-MM-DD')
快速验证格式 TIMESTAMP
类型避免隐式转换 Q:为什么加了配置还是报错?
A:检查是否有多处配置冲突,建议清空Tomcat缓存后重启
Q:历史数据已经混乱怎么办?
A:用UPDATE table SET date_col = TO_DATE(TO_CHAR(date_col, 'YYYY-MM-DD'), 'YYYY-MM-DD')
批量修复
2025年依然坚挺的Struts2+Oracle组合,只要遵循"前后格式统一 + 中间强制转换 + 后端会话控制"三原则,日期问题将彻底成为历史!🎉 现在就去试试吧~
(本文方法已在Oracle 21c + Struts2.5.30环境验证通过 ✅)
本文由 唐皎 于2025-08-03发表在【云服务器提供商】,文中图片由(唐皎)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/521002.html
发表评论