You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay 7.2中如何提取并显示Blob类型存储的JSON字段数据

Blob字段JSON内容读取修复方案

错误原因

你直接操作com.mysql.cj.jdbc.Blob对象本身没有读取内部存储的二进制数据,所以打印只会输出对象的内存地址;将Blob强制转为DataInput属于非法类型转换,运行时会抛出类转换异常。同时你原代码循环内调用myList.getContentId()属于逻辑错误,应该调用循环变量的对应方法获取单条数据的ID。

修复代码

优先直接使用Blob的二进制流交给Jackson解析,避免额外内存开销:

import java.sql.Blob;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.charset.StandardCharsets;
import java.util.List;

// 循环逻辑部分
for (ddmcontent MyTemp : myList) {
    System.out.println("Content ID       : " + MyTemp.getContentId());
    Blob responseBody = MyTemp.getData();
    // 空校验避免空指针
    if (responseBody == null) {
        continue;
    }
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        List<ModelData> myDat = objectMapper.readValue(
            responseBody.getBinaryStream(),
            objectMapper.getTypeFactory().constructCollectionType(List.class, ModelData.class)
        );
        for (ModelData dt : myDat) {
            // 建议ModelData属性遵循Java规范首字母小写,通过getter方法取值
            System.out.println("User Name              : " + dt.Name);
            System.out.println("Users Email            : " + dt.Email);
        }
        // 释放Blob占用的数据库资源
        responseBody.free();
    } catch (Exception e) {
        // 按需处理异常:日志打印/错误抛出等
        e.printStackTrace();
    }
}

可选适配方案

如果你的JSON存储使用了非UTF-8编码,可以先将Blob内容转为指定编码的字符串再解析:

String jsonContent = new String(responseBody.getBinaryStream().readAllBytes(), StandardCharsets.UTF_8);
List<ModelData> myDat = objectMapper.readValue(
    jsonContent,
    objectMapper.getTypeFactory().constructCollectionType(List.class, ModelData.class)
);

其他注意事项

  • ModelData类需要提供无参构造方法,如果属性为私有类型,需要补充对应的Getter/Setter方法,或者为属性添加@JsonProperty注解匹配JSON键名
  • 生产环境不要每次循环都创建ObjectMapper实例,建议将其定义为全局单例复用,减少性能开销

内容的提问来源于stack exchange,提问作者Aftab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 08:21:02