- 博客(41)
- 收藏
- 关注
原创 Streamable HTTP与SSE有什么区别
如实时日志分析系统,可按自定义格式拆分日志片段,客户端按需解析关键信息,无需处理 SSE 格式冗余字段。
2025-11-18 15:18:56
852
原创 动态sql失效-MyBatis 对数字类型的隐式判断规则
最近公司在业务开发中大力推行 AI 辅助写代码,作为一线开发者,我对这种新工具并不抵触。毕竟在重复且标准化的编码场景里,AI 确实能展现出高效的一面 —— 它往往能快速完成,把我们从机械的代码编写中解放出来,节省下不少时间。但真正考验人的,恰恰是剩下那,这不,我刚在 AI 生成的动态 SQL 上栽了个 “隐蔽的坑”。
2025-11-17 21:29:33
536
原创 Spring AI :对话连续性之记忆模块
摘要: Spring AI 的对话系统默认缺乏连续性,导致用户体验不佳。通过引入记忆模块(ChatMemoryRepository)存储对话上下文,可实现连贯交互。记忆模块的核心原理包括:为对话分配唯一ID、持久化有效消息、读取历史构建上下文。开发者可自定义本地存储(如FilteredChatMemoryRepository)或使用JDBC持久化方案(JdbcChatMemoryRepository)。本地存储适合测试,但需注意数据易失性;JDBC方案支持生产环境,确保多实例共享和持久化。两种方式均需合理过
2025-09-11 16:59:14
1064
原创 Spring AI:MCP实现方案
本文介绍了基于Spring AI框架搭建MCP Server的完整流程。首先说明MCP协议支持的两种通信模式(STDIO和SSE),并详细讲解如何添加依赖、配置服务参数。核心内容是通过@Tool注解编写本地工具方法,并在启动类中注册这些方法。文章还提供了客户端调用配置示例和执行结果说明,展示了如何将本地方法快速服务化并通过MCP协议暴露。整个过程充分利用了Spring AI的自动配置能力,简化了MCP Server的开发流程。
2025-07-16 20:15:00
1338
原创 Spring AI:模型调用本地方法(Tools)的实现方案
本文介绍了如何在Spring AI中实现模型与本地方法的交互。通过工具调用模式,模型可以扩展能力,直接调用本地方法完成特定任务。文章详细讲解了工具的定义方法,包括使用@Tool和@ToolParam注解标记工具方法和参数,并提供了工具注册到模型的多种方式:在请求中直接注册、在ChatClient中默认注册、通过ToolCallback注册以及编程式构建工具。此外,还介绍了如何通过ToolContext传递额外信息,增强工具的灵活性。代码示例和注解解析帮助开发者快速上手Spring AI Tools的使用。
2025-07-16 20:00:00
1356
原创 Spring AI:框架中实践MCP Client SSE模式调用指南
本文详解了SSE模式下的高德地图MCP Server流式调用实现。首先介绍了SSE基础配置,包括核心连接参数、日志验证及服务申请指引。重点分析了响应式编程中常见的阻塞陷阱,通过错误示例展示了动态工具回调导致的线程阻塞问题。最后提出预注册工具列表的优化方案,在应用启动时完成工具初始化,确保流式调用的非阻塞特性。文章还提供了优化后的代码实现和关键注意事项,为开发者提供了完整的SSE流式调用实践指南。
2025-07-11 19:50:04
1720
10
原创 Spring AI:框架中实践MCP Client STDIO模式调用指南
本文介绍了Spring AI框架中MCP(模型上下文协议)的实战调用方法,涵盖环境配置、本地Stdio模式调用、启动验证以及跨框架兼容问题解决。首先需根据项目框架类型(WebFlux或MVC)选择对应依赖,并配置主文件和MCP服务定义文件。文章提供了完整代码示例和配置参数说明,帮助开发者快速上手并规避
2025-07-10 20:00:00
2073
原创 Spring AI:模型上下文协议(MCP)详解
摘要: 模型上下文协议(MCP)通过标准化交互规范,实现AI模型与外部工具的灵活协同,呼应老子"化整为零、协同共生"的哲学理念。其技术架构包含三层:客户端/服务器层负责通信管理,会话层处理协议协商,传输层实现消息序列化。Spring AI MCP深度集成Java生态,提供强类型安全和声明式工具集成,与其他语言实现(如Python的动态性、Go的高并发)形成互补。MCP协议通过统一语言解决AI交互碎片化问题,为智能系统协作提供通用框架。
2025-07-09 20:07:26
970
原创 Spring AI:让 AI 开发回归简单
Spring AI 开发实践摘要 Spring AI 以标准化框架简化AI应用开发,依托Spring生态实现企业级开箱即用。本文通过WebFlux构建流式聊天应用,整合本地Ollama模型: 核心优势:相比LangChain等框架,Spring AI在Java生态集成、生产级特性(安全/监控)表现突出 开发关键: 配置模型连接(Ollama/Qwen)与生成参数(temperature=0.7) 通过ChatClient定义AI角色(如游玩规划员) WebFlux的Flux类型实现流式响应
2025-07-08 20:19:15
685
翻译 idea插件开发经验总结(三):持久化数据
影动星河近,月明无点尘。雁声鸣远汉,砧韵响西邻。归鸟栖枯树,禅僧讲梵音。蒲团一榻上,坐到夜将分。——《西游记·第十三回》
2022-12-29 15:34:38
1763
原创 977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]提示:1 <= nums.length <= 104-104 <= nums
2022-02-23 20:00:23
125
原创 740. 删除并获得点(打家劫舍三)
给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例 1:输入:nums = [3,4,2]输出:6解释:删除 4 获得 4 个点数,因此 3 也被删除。之后,删除 2 获得 2 个点数。总共获得 6 个点数。示例 2:输入:nums = [2,2,3,
2022-02-23 18:29:44
165
原创 213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻
2022-02-22 14:29:52
608
原创 198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7,9,3,
2022-02-22 10:35:23
131
原创 746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15 。示例 2:输入:cost = [1,100,1,1,1,100,1,1,100,1]输出
2022-02-21 20:34:23
110
原创 70. 爬楼梯
泰波那契序列 Tn 定义如下:T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。示例 1:输入:n = 4输出:4解释:T_3 = 0 + 1 + 1 = 2T_4 = 1 + 1 + 2 = 4示例 2:输入:n = 25输出:1389537提示:0 <= n <= 37答案保证是一个 32 位整数,即 answer <= 2^
2022-02-21 19:55:51
125
原创 509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 n ,请计算 F(n) 。示例 1:输入:n = 2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1示例 2:输入:n = 3输出:2解释:F(3) = F(2) + F(1) = 1 + 1 = 2示
2022-02-21 16:21:13
257
原创 35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例 2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3,5,6], target = 7输出: 4示例 4:输入: nums = [1,3,5,6], target
2022-02-21 16:18:55
125
原创 278. 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例 1:输入:n = 5, bad
2022-02-21 16:03:50
105
原创 二分查找-rust
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1提示:你可以假设 nums 中的所
2022-02-21 10:21:52
197
原创 tomcat jdbc数据源的jndi配置
jndi是什么?JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是...
2021-03-04 09:41:10
382
原创 git恢复blob文件
由于本人的一次不小心的操作,在本地仓库中执行add操作后,又执行了reset操作,导致本地的代码全部删除。痛心疾首,还是想想怎么恢复自己删除的代码吧。通过翻阅资料,这种情况是可以找回自己的代码的,只是过程比较麻烦,特此记录下操作步骤。模拟下出现的场景1、首先创建一个新的目录 并执行初始化命令,初始化一个新的仓库git init2、执行添加命令,把代码添加到仓库中git add3、执行回滚...
2021-03-03 14:40:56
1359
1
原创 Servlet sendRedirect(重定向)与forworld(转发) 请求是否还会走filter
首先我们看下 sendRedirect(重定向)与forworld(转发)的具体是指什么:一个web资源受到客户端请求后,通知服务器去调用另一个web资源进行处理,称之为请求转发。 一个web资源受到客户端请求后,通知浏览器去调用另一个web资源进行处理,称之为请求重定向。根据字面意思上理解,重定向肯定是会重新走filter了,因为重定向是告知浏览器再次发出请求。而请求转发则是服务器内部的逻.........
2021-03-03 14:12:18
1271
2
原创 spring-boot的main函数可以不放在启动类里面
在我前面的文章spring-boot自动装配写道,spring-boot启动时根据启动函数中设置的启动类,然后根据启动类上的注解@SpringBootApplication 开启整个项目的自动注入过程。前几天,我研究@SpringBootApplication注解,发现其是被@Inherited注解标记的。@Inherited是做什么的呢?根据jdk文档我们可以知道,@Inherited主要是为...
2020-07-06 20:50:36
605
原创 spring-boot项目用jar包启动时Launcher与项目的启动函数是否在同一线程
spring-boot 可执行jar中META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: Maven Archiver 3.4.0 Build-Jdk-Spec: 11 Implementation-Title: spring-boot Implementation-Version: 0.0.1-SNAPSHOT Main-Class: ...
2019-11-07 09:49:37
248
原创 在 boot 操作过程中的 FIRST_BOOT阶段,安装失败,出现错误
今天帮朋友安装系统的时候出现在 boot 操作过程中的 FIRST_BOOT阶段,安装失败,出现错误image.png百度了很多方法还是不好用,最终还是用u盘启动盘的方法吧朋友新加了一个硬盘 在选择系统盘的时候 报错Windows只能安装到cpt磁盘上难道原来的系统不是cpt分区格式的?没办法,只能手动转换磁盘分区格式。在安装页面1:按键shift+f10 ,打开cmd命...
2019-06-22 22:14:38
19585
原创 mysql8.0 navicat连接不上
用navicat 连接mysql8.0服务是报:Client does not support authentication protocol requested by server解决办法如下:转载链接:https://blog.youkuaiyun.com/seventopalsy/article/details/80195246mysql8 之前的版本中加密规则是mysql_native_pas...
2019-06-20 10:29:07
124
原创 spring用@Autowired注入map出现的问题
最近做项目,无意间用到了spring注入集合的问题,具体问题如下:在spring配置文件中配置map如下:image.png在项目中使用map如下:@Autowiredprivate Map<String, HandlerInterceptor> handlerMap;奇怪的是,当我使用handlerMap.get("async")获取处理类时,获取不到具体的bea...
2019-04-16 16:50:45
1446
原创 idea 右侧maven项目显示多份
今天打开项目,更新后发现右侧maven目录 显示多份项目,如下:微信图片_20190314111416.png但是也不影响自己的使用,但是有点小强迫症的我受不了。既然maven显示有问题,肯定是maven的配置出问题了微信图片编辑_20190314111913.jpg如图 删除所有的iml文件,然后从新导入项目 问题就解决了...
2019-03-14 11:21:43
1462
原创 idea maven配置 远程仓库连接不上
最近使用idea发现了一个奇怪的问题,我的maven连接公司的私库连接不上了。郁闷!。。。思考:怎么会出现这种问题呢?1:远程仓库配置错误2:本地host配置影响到私库的连接3:远程仓库挂了4:idea 某些配置 禁止了maven连接私库排查:在浏览器访问私库地址可以正常访问 2、3 pass远程仓库配置 把同事的配置文件copy一份 还是不行 1 pass那么,可能是idea...
2019-03-05 16:56:26
3232
原创 日志打印无堆栈信息
情况:系统抛出异常,日志没有打印堆栈信息 错误日志正常打印分析:异常信息打印格式没有错误,本地测试没有问题,线上其他环境也没有类似的情况。 可能是jvm禁掉了某些东西,导致了异常信息没有打印出来资料:https://stackoverflow.com/questions/2295015/log4j-not-printing-the-stacktrace-for-exceptionshttp...
2019-02-19 11:30:38
410
原创 HashMap 对于key是null值的存储
HashMap 允许插入键为 null 的键值对。但是因为无法调用 null 的 hashCode() 方法,也就无法确定该键值对的桶下标,只能通过强制指定一个桶下标来存放。HashMap 使用第 0 个桶存放键为 null 的键值对。1.6版本 :public V put(K key, V value) { if (key == null) retur...
2019-01-10 10:56:46
891
原创 spring-boot自动装配
前面一篇文章创建自己的spring-boot-starter介绍了怎么创建一个spring-boot-starter,那spring-boot是怎么把starter自动装配进来的呢?这章我们来探讨一下创建自动装配主要两个点:1、SpringApplication注解上的@import 引入AutoConfigurationImportSelector.class类选择器2、META-INF\...
2019-01-07 17:30:32
137
原创 创建自己的spring-boot-starter
创建一个spring-boot-starter非常简单1.创建一个空的项目并构建2.创建自己的BeanConfiguration类 并设置好触发条件(@Conditional(spring 4.0.x 提供的 最低要就java版本1.6))spring-boot中提供的条件注解有: @ConditionalOnBean :匹配给定的class类型或者Bean的名字是否在Spring...
2018-12-29 17:12:00
92
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅