异常java.lang.ClassCastException: weblogic.jdbc.wrapper.Blob_oracle_sql_BLOB cannot be cast to oracle.sql.BLOB
大家好!最近生产环境遇到了个问题,一个在线预览pdf的功能出现了问题。因为在自己本地上没有复现出来,于是就去线上查看了日志,发现了如上的报错异常,大概意思是weblogic的 BLOB不能强制转换为oracle.sql.BLOB,因为生产环境是部署在weblogic上的,weblogic把blob类型封装了,而自己在本地用tomcat启动,所以没复现出来
那么解决这个问题,有两种方法:
1.既然weblogic把这个类型封装了,那么我们不让它封装就可以了。修改Weblogic配置如下图所示。点开服务,选择数据源,选择自己的数据源,然后点链接池,找到下方的高级,将包装数据类型取消勾选,就可以了.
2.当然,考虑到贸然修改weblogic配置可能引起别的功能异常,我们可以修改自己的代码实现方式,在我们的代码中报错出在这一行上 *BLOB blobs = (oracle.sql.BLOB) result.get(0);*大致意思是从查询结果中将blob类型的数据强制转换成(oracle.sql.BLOB),那我们不用这种方式获取blob就行了。
MyBatis的实现方式
<!--这里指定jdbcType为BLOB,返回类型定义为map-->
<resultMap type="map" id="RefFileMap">
<result column="FILE" property="file" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />
</resultMap>
<!--FILE为数据库的blob字段-->
<select id="queryPdfFile" resultMap="RefFileMap">
SELECT FILE FROM USER_FILE WHERE ID =#{ID}
</select>
业务层正常写
Map<String,Object> fileMap = fileService.queryFile(map);
byte[] bt = null;
// 获取blob字段
bt = (byte[]) fileMap.get("file");
// 转成InputStream流
InputStream is = new ByteArrayInputStream(bt);
这样就可以解决上面的报错了,希望本次的分享能够帮大家少走一点弯路。也欢迎大家提问评论啊!!!