MyBatis对SpringAI聊天记忆存取的处理器(聊天对话以Json存储的)

今天在实现自己的ChatMemory时,数据表设计将与AI的对话数据以JSON格式进行存储。在存储过程很顺利,但是在读取数据时出现了问题,经过观察分析,因为SpringAI的存储的对话集合里面的类型都是不一样的。

image.png

所以反序列化后读取对应的字段的时候会框框报错。我的解决办法就是定制MyBatis的字段类型处理器了

java
复制代码
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; import lombok.NoArgsConstructor; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import org.springframework.ai.chat.messages.*; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes({List.class}) @NoArgsConstructor public class MessageTypeHandler extends BaseTypeHandler<List<Message>> { private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, List<Message> parameter, JdbcType jdbcType) throws SQLException { try { ps.setString(i, objectMapper.writeValueAsString(parameter)); } catch (JsonProcessingException e) { throw new SQLException("Error converting object to JSON", e); } } @Override public List<Message> getNullableResult(ResultSet rs, String columnName) throws SQLException { String json = rs.getString(columnName); return parseJson(json); } @Override public List<Message> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String json = rs.getString(columnIndex); return parseJson(json); } @Override public List<Message> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String json = cs.getString(columnIndex); return parseJson(json); } private List<Message> parseJson(String json) { List<Message> arrayList = new ArrayList<>(); if (json == null || json.isEmpty() || "[]".equals(json)) { return arrayList; } try { List<LinkedHashMap> list = objectMapper.readValue(json, new TypeReference<>() {}); for (LinkedHashMap map : list) { String type = (String) map.get("messageType"); MessageType messageType = MessageType.fromValue(type.toLowerCase()); String message = (String) map.get("text");; arrayList.add(switch (messageType) { case SYSTEM -> new SystemMessage(message); case USER -> new UserMessage(message); case ASSISTANT -> new AssistantMessage(message); default -> throw new IllegalArgumentException("Unknown message type: " + type); }); } } catch (Exception e) { throw new RuntimeException(e); } return arrayList; } }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
码农烧烤
作者分享
兄弟们,最近拿了两个offer,一个是南网外包15K六险一金,一个是agent自研小公司12K,有五险没有一金,说可能明年年中后会加上,自研这个是新创公司,今天年初的时候才建立的。我有点拿不定主意,求求兄弟们给点意见或者见解
9
最近花了点时间把去年写的智能BI项目改造了一下,因为看了智能协同云图库的DDD改造有点手痒,所以把BI项目改了一下,结果写着写着了解了更多领域驱动的知识,发现自己离标准的DDD还是有很大差距,我写的一点也优雅。然后就是又引入了一下Langchain4j,调整了一下AI的调用和新增了知识库,实现了Rag的智能知识问答(向量数据库选的ES)。有兴趣的看看,最好是可以指点一下哈哈哈哈哈 项目地址https://github.com/chenrgSix/rgbi_backend
4
我的天,今天刚接触pgsql,踩了好多坑,和mybatis好像契合度不是很高,jsond字段和uuid数据类型的字段都要做适配,jsond还好,多设置一下就好,uuid还没搞出来,明天再试试,不行就用varcher来搞。
4
上了两天班,突然间发现我误入了工业软件。公司希望我能找几个iot的开源项目便于后面进行二开,但是我不懂啊,我真的不懂啊。有没有了解iot这方面的兄弟推荐一下
3
今天本来还准备接着投简历的,结果收到offer了,明天就可以过去了。本来一直害怕找不到工作,目前投了一两百份简历,只有两个面试。第一个面试就是这个目测几十人的小公司,第二个面试是国企,可惜国企没过。虽然没有攒到什么面试经验,但是工作可算有着落了[流泪]。多亏鱼皮提供的简历编写技巧,不然都没人看[玫瑰]马上就是打工人了。
10
下载 APP