WAS 8.5.5部署Java应用遇Cp037编码不支持错误求助
首先,这个问题的核心是WAS默认的编码环境和DB2 JDBC驱动的编码要求不匹配——Cp037是IBM的EBCDIC编码,而你的应用在Tomcat上能正常运行,是因为Tomcat默认的JVM编码通常是UTF-8,不会触发这个冲突。下面是一步步的解决方案:
1. 确认DB2 JDBC驱动版本兼容性
确保你使用的是适配WAS 8.5.5、Java 8和DB2版本的驱动包(推荐db2jcc4.jar)。旧版本的DB2驱动可能在WAS的IBM编码环境下对Cp037的处理存在bug,建议替换为WAS支持的最新兼容版本(可从IBM官方渠道获取对应WAS版本的DB2驱动)。
2. 修改WAS数据源的自定义属性
登录WAS管理控制台,找到你的DB2数据源,添加以下自定义属性:
ccsid=1208(1208是UTF-8对应的CCSID编码)clientEncoding=UTF-8encoding=UTF-8
这些参数会强制DB2驱动使用UTF-8编码,绕过默认的Cp037编码检测。
3. 调整WAS JVM的系统属性
在WAS控制台中找到对应服务器的JVM参数配置,添加以下启动参数:
-Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=US
这会修改WAS JVM的默认编码和区域设置,避免使用Cp037作为默认编码。
4. 检查Hibernate连接配置
在你的Hibernate配置文件(hibernate.cfg.xml或persistence.xml)中添加以下属性:
<property name="hibernate.connection.characterEncoding">UTF-8</property> <property name="hibernate.connection.useUnicode">true</property>
确保Hibernate层面也明确指定了连接编码,和WAS、DB2的设置保持一致。
5. 验证WAS服务器区域设置
在WAS管理控制台的服务器 > 服务器类型 > WebSphere应用服务器中,查看对应服务器的“区域设置”,确保选择的是支持UTF-8的区域(比如en_US),而不是默认的IBM EBCDIC相关区域。
附:你的错误信息回顾
java.io.UnsupportedEncodingException: Cp037
at sun.io.Converters.getConverterClass(Converters.java:319)
at sun.io.Converters.newConverter(Converters.java:373)
at sun.io.ByteToCharConverter.getConverter(ByteToCharConverter.java:98)
at com.ibm.db2.jcc.b.p.a(p.java:435)
... 132 more
2020-01-09 17:20:13 WARN SqlExceptionHelper:143 - SQL Error: -99999, SQLState: 22021
2020-01-09 17:20:13 ERROR SqlExceptionHelper:144 - [ibm][db2][jcc][10275][10041] Unsupported ccsid, encoding, or locale: "Cp037"
如果以上步骤还没解决问题,可以告诉我你的DB2版本、WAS中部署的驱动版本,我再帮你排查更细节的点。
内容的提问来源于stack exchange,提问作者sivabalaji

