惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
V
Visual Studio Blog
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
B
Blog
I
InfoQ
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
H
Help Net Security
博客园 - Franky
宝玉的分享
宝玉的分享
博客园 - 司徒正美
C
Check Point Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家

博客园 - cn2025

K8s -sentinel-dashboard【nacos版本】集 20260815 kubeSphere【ks-controller-manager-webhook-cert】证书 20260814 K8s -nacos集 20260813 K8s - 安装部署redis集群-哨兵sentinels集(支持从K8s外部访问)20260812 k8s-deployment发布测试(pv-pvc-deployment-service) 20260810 K8s - 安装部署Kafka、Zookeeper集群教程(支持从K8s外部访问)20260808 k8s-关机及启动脚本工具 【kubeSphere发布ruoyi-pro前端】工具脚本20260731 【k8s】 etcd服务端及客户端版本及快照【定时】备份 20260730 harbor【https启用】及k8节点部证书20260728 kube-flannel.yml k8s集群-安装helm 【kubeShpere】 官网 20260710 kubesphere-KDP 工具脚本【kubeSphere发布ruoyi-pro前端】20260720 HbuilderX 内置终端转为 gitBash 20260720 kubeSphere发布ruoyi-pro后端-用到脚本 kubeSphere发布ruoyi-web前端 20260711 kubeSphere发布ruoyi-pro后端 k8s集群-kubeShpere 20260710 安装Helm 20260710 k8s-portainer docker 镜像查询 k8集群一键重置 docker run OceanBase spring ai alibaba doc AI2.0 【多模态】 20260615 世界只有一个墨脱 AI2.0 【Mcp-client】 20260611 AI2.0 【Mcp-server】 20260611 GoLand 配Go SDK
票务 Tool+Spring Security【动态tooLs:toolCallbacks】 2026...
cn2025 · 2026-05-25 · via 博客园 - cn2025
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.ai.tool.definition.ToolDefinition;
import org.springframework.ai.tool.method.MethodToolCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.List;

@Service
public class ToolService {

@Autowired
private TicketService ticketService;
//
// record cancelParam(String dsadsa,String fdasfda){}
//
// @Tool(description = "退票")
// public String cancel(cancelParam param) {
// ticketService.cancel(param.dsadsa(), param.fdasfda());
// return "退票成功!";
// }

// record cancelParam(String mmmmmmmmmmqweqweqw,String oooooooooodsfsdds){}
//
// // @Tool告诉大模型提供了什么工具
// @Tool(description = "根据订单号和乘客姓名办理机票退票业务,退票成功后会返还票款")
// public String cancel(
// //@ToolParam告诉大模型参数描述
// cancelParam param) {
// //先查询--->先校验
// ticketService.cancel(param.mmmmmmmmmmqweqweqw(), param.oooooooooodsfsdds());
// return "退票成功!";
// }

//record cancelParam(String ticketNumber,String name){}

// @Tool告诉大模型提供了什么工具
// @Tool(description = "退票")
// public String cancel(
// //@ToolParam告诉大模型参数描述
// cancelParam param) {
// //先查询--->先校验
// ticketService.cancel(param.ticketNumber(), param.name());
// return "退票成功!";
// }

// @Tool(description = "退票")
// public String cancel(
// //@TooLParam告诉大模型参数的描述 加严参数描述与校验
// @ToolParam(description = "预定号,可以是纯数字") String ticketNumber,
// @ToolParam(description = "真实人名(必填,必须为人的真实姓名,严禁用其他信息代替如缺失请传null)") String name) {
// // 后端代码加强校验和兜底保护
// //先查询--->先校验
// ticketService.cancel(ticketNumber, name);
// return "退票成功!";
// }

record cancelParam(String ticketNumber,String name){}

// @Tool告诉大模型提供了什么工具
@Tool(description = "退票")
@PreAuthorize("hasRole('ADMIN')")
public String cancel(
//@TooLParam告诉大模型参数的描述 加严参数描述与校验
@ToolParam(description = "预定号,可以是纯数字") String ticketNumber,
@ToolParam(description = "真实人名(必填,必须为人的真实姓名,严禁用其他信息代替如缺失请传null)") String name) {
// 后端代码加强校验和兜底保护
// 获取当前登录用户信息
String username = SecurityContextHolder.getContext()
.getAuthentication()
.getName();
//先查询--->先校验
ticketService.cancel(ticketNumber, name);
return username + "退票成功!";
}

@Tool(description = "获取指定位置的天气,根据位置自动推算经纬度")
public String getAirQuality(
@ToolParam(description = "纬度") double latitude,
@ToolParam(description = "经度") double longitude) {
return "天晴";
}

/**
* 模拟从数据库中动态根据当前用户角色读取tooLs
* @param toolService
* @return
*/
public List<ToolCallback> getToolCallList(ToolService toolService) {
//1.获取tools处理的方法
Method method = ReflectionUtils.findMethod(ToolService.class,
"cancel", String.class, String.class);
//2.构建Tool定义信息 动态配置的方式@Tool @Toop
ToolDefinition build = ToolDefinition.builder()
.name("cancel")
.description("退票")
//对应@ToolParam
.inputSchema("""
{
"type": "object",
"properties": {
"ticketNumber": {
"type": "string",
"description": "预定号,可以是纯数字"
},
"name": {
"type": "string",
"description": "真实人名"
}
},
"required": ["ticketNumber", "name"]
}
""")
.build();
//一个Toolcallback对应一个tool
ToolCallback toolCallback = MethodToolCallback.builder()
.toolDefinition(build)
.toolMethod(method)
.toolObject(toolService) // 不能自己new,自己new不能解析依赖注
.build();
return List.of(toolCallback);

}

}