异常java.lang.ClassCastException: weblogic.jdbc.wrapper.Blob_oracle_sql_BLOB cannot be cast to oracle.

文章讲述了在生产环境中遇到的Java类转换异常,由于Weblogic对BLOB类型的封装导致无法直接转换为oracle.sql.BLOB。提供了两种解决方案:一是修改Weblogic配置,取消包装数据类型;二是通过MyBatis使用BlobTypeHandler处理BLOB类型,从Map中获取字节数组并转化为InputStream,避免直接转换。这种方法在不修改Weblogic配置的情况下也能解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常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);

这样就可以解决上面的报错了,希望本次的分享能够帮大家少走一点弯路。也欢迎大家提问评论啊!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值