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
相关产品推荐
相关产品推荐

