首页/新闻资讯/正文详情

Spring 4-Spring Boot 1.x项目想做AI?不用升级Spring,3种神级方案包您无痛接入!

发布时间:2026/9/24 17:22:07 来源:云帆数科 栏目:资讯中心
Spring 4-Spring Boot 1.x项目想做AI?不用升级Spring,3种神级方案包您无痛接入!
不知不觉已经2个多月感谢各位朋友的认可和支持随着AI的日新月异很多公司都开展了AI相关的业务这也使得很多公司的老板都想去沾沾边而他却不知道自己公司的项目即屎山代码还是老的架构所以很多朋友问“老项目呢大量Spring 4/Spring Boot 1.x的核心系统想做AI但新框架都用不了升级风险又大”这个问题问得太真实了。不少公司的核心系统还跑在Spring Framework 4.x / Spring Boot 1.x上想做大模型功能但一查文档就懵了——Spring AI要求Spring Boot 3.xLangChain4j的Spring Boot集成也要2.7起步直接引入全是javax.*和jakarta.*的冲突编译都过不了。这个问题问得太真实了。很多公司的核心系统还跑在Spring Framework 4.x / Spring Boot 1.x上想做大模型功能但一查文档就懵了——Spring AI要求Spring Boot 3.xLangChain4j的Spring Boot集成也要2.7起步直接引入全是javax.*和jakarta.*的冲突编译都过不了。升级框架那可是核心业务系统回归测试跑一遍半个月出了事故谁背锅但Spring 4就真的没法做AI了吗当然不是。大模型本质上就是个HTTP接口和你调第三方支付、调短信网关没有任何区别。今天给3种方案从最简单的零依赖手写调用到官方SDK再到微服务拆分不用升级一行Spring代码Spring 4项目也能接入大模型。先搞清楚为什么新框架在Spring 4里用不了很多人以为是版本太低其实核心原因是Java EE和Jakarta EE的不兼容。Spring 4 / Spring Boot 1.x → 用的是Java EE包名是javax.servlet.*、javax.persistence.*Spring Boot 3.x / Spring 6 → 用的是Jakarta EE包名是jakarta.servlet.*、jakarta.persistence.*这两个包名不兼容所以Spring AI、LangChain4j的Spring Boot Starter这些基于Spring Boot 3的框架直接在Spring 4项目里引入就会报类冲突。但注意不兼容的是Spring集成层不是大模型调用本身。只要不用那些Spring Boot Starter纯Java的大模型调用在任何Spring版本里都能跑。理解了这一点下面3种方案就顺理成章了。方案1OkHttp手写调用大模型API零依赖首选这是最简单、最通用、最不容易出问题的方案。大模型的接口就是标准的HTTP POST返回JSON你用OkHttp发请求、用fastjson解析响应完事。优点零Spring依赖JDK 6就能跑不侵入现有项目不会有任何依赖冲突缺点需要自己封装重试、超时、流式输出但这些都不难第一步引入依赖Spring 4兼容版本注意版本选择不要用最新版最新版可能要求高版本JDK!-- OkHttp 3.12.x是最后一个支持JDK 7的版本JDK 8用3.14.x也没问题 -- dependency groupIdcom.squareup.okhttp3/groupId artifactIdokhttp/artifactId version3.14.9/version /dependency !-- fastjson 1.2.x兼容低版本JDK不要用fastjson2 -- dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version1.2.83/version /dependency第二步封装大模型客户端package com.example.ai; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import okhttp3.*; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; /** * 大模型通用客户端Spring 4兼容零Spring依赖 * 基于通义千问OpenAI兼容接口其他模型改base-url即可 */ public class LlmClient { private final OkHttpClient httpClient; private final String apiKey; private final String baseUrl; private final String model; public LlmClient(String apiKey, String baseUrl, String model) { this.apiKey apiKey; this.baseUrl baseUrl; this.model model; this.httpClient new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build(); } /** * 最简对话调用 * param systemPrompt 系统提示词 * param userMessage 用户问题 * return 大模型回答 */ public String chat(String systemPrompt, String userMessage) throws IOException { // 1. 构建消息 JSONObject systemMsg new JSONObject(); systemMsg.put(role, system); systemMsg.put(content, systemPrompt); JSONObject userMsg new JSONObject(); userMsg.put(role, user); userMsg.put(content, userMessage); JSONArray messages new JSONArray(); messages.addAll(Arrays.asList(systemMsg, userMsg)); // 2. 构建请求体 JSONObject requestBody new JSONObject(); requestBody.put(model, model); requestBody.put(messages, messages); requestBody.put(temperature, 0.3); // 3. 发送HTTP请求 Request request new Request.Builder() .url(baseUrl /chat/completions) .addHeader(Authorization, Bearer apiKey) .addHeader(Content-Type, application/json) .post(RequestBody.create( MediaType.parse(application/json; charsetutf-8), requestBody.toJSONString())) .build(); // 4. 解析响应 try (Response response httpClient.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException(大模型调用失败HTTP状态码 response.code() 响应 response.body().string()); } String body response.body().string(); JSONObject json JSON.parseObject(body); return json.getJSONArray(choices) .getJSONObject(0) .getJSONObject(message) .getString(content); } } /** * 带重试的调用生产环境必备 */ public String chatWithRetry(String systemPrompt, String userMessage, int maxRetries) { for (int i 0; i maxRetries; i) { try { return chat(systemPrompt, userMessage); } catch (IOException e) { System.err.println(第 (i 1) 次调用失败 e.getMessage()); if (i maxRetries - 1) { throw new RuntimeException(大模型调用失败已重试 maxRetries 次, e); } try { Thread.sleep(1000 * (i 1)); // 指数退避 } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } } } return null; } }第三步在Spring 4项目里使用package com.example.service; import com.example.ai.LlmClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.io.IOException; /** * 在Spring 4项目中使用大模型 * 注意这里用的是javax.annotation.PostConstructJava EE * 不是jakarta.annotation.PostConstructJakarta EE */ Service public class AiService { Value(${llm.api-key}) private String apiKey; Value(${llm.base-url:[https://dashscope.aliyuncs.com/compatible-mode/v1](https://dashscope.aliyuncs.com/compatible-mode/v1)}) private String baseUrl; Value(${llm.model:qwen-turbo}) private String model; private LlmClient llmClient; PostConstruct public void init() { // 手动new出来不需要Spring Boot Starter自动装配 this.llmClient new LlmClient(apiKey, baseUrl, model); } /** * 智能问答 */ public String ask(String question) { try { String systemPrompt 你是一个 helpful 的智能助手回答要简洁准确。; return llmClient.chatWithRetry(systemPrompt, question, 3); } catch (Exception e) { // 降级兜底大模型不可用时返回默认回答 return 抱歉AI服务暂时不可用请稍后重试。; } } }关键点整个客户端没有任何Spring依赖就是纯Java OkHttp fastjson。你把LlmClient这个类复制到任何Spring 4、Spring 3、甚至纯Servlet项目里都能直接用。这是最稳妥的方案没有之一。方案2引入官方SDK不依赖Spring版本如果你不想自己封装HTTP调用可以用大模型厂商的官方SDK。这些SDK通常是纯Java库不依赖Spring所以在Spring 4项目里也能直接引入。以阿里通义千问的官方SDK为例第一步引入依赖!-- 通义千问官方SDK纯Java库不依赖Spring -- dependency groupIdcom.alibaba/groupId artifactIddashscope-sdk-java/artifactId version2.14.6/version !-- 选兼容JDK 8的版本不要用最新版 -- /dependency第二步使用SDK调用package com.example.ai; import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationParam; import com.alibaba.dashscope.aigc.generation.GenerationResult; import com.alibaba.dashscope.common.Message; import com.alibaba.dashscope.common.Role; import java.util.Arrays; /** * 使用官方SDK调用大模型不依赖Spring */ public class DashScopeService { private final String apiKey; public DashScopeService(String apiKey) { this.apiKey apiKey; } public String chat(String userMessage) throws Exception { // 1. 构建消息 Message systemMsg Message.builder() .role(Role.SYSTEM.getValue()) .content(你是一个 helpful 的助手。) .build(); Message userMsg Message.builder() .role(Role.USER.getValue()) .content(userMessage) .build(); // 2. 构建请求参数 GenerationParam param GenerationParam.builder() .apiKey(apiKey) .model(qwen-turbo) .messages(Arrays.asList(systemMsg, userMsg)) .temperature(0.3f) .build(); // 3. 调用 Generation gen new Generation(); GenerationResult result gen.call(param); // 4. 解析结果 return result.getOutput().getChoices().get(0).getMessage().getContent(); } }优点官方维护功能全支持流式、Function Calling、多模态等不用自己封装HTTP缺点引入额外依赖老项目可能和现有依赖冲突比如okhttp版本、gson版本SDK版本更新快新版本可能要求高版本JDK一定要选兼容你JDK版本的旧版本绑定特定厂商换大模型要改代码避坑提醒引入官方SDK前先看它的依赖树。很多SDK内部依赖了okhttp、gson、guava等如果你的项目里已经有这些库且版本不同很容易出现NoSuchMethodError。冲突了就用maven的exclusions排掉或者干脆回方案1自己手写。方案3单独起AI微服务老项目HTTP/RPC调用长期推荐如果你的AI功能会越来越复杂要做RAG、Agent、多轮对话、流式输出方案1和2就不够用了——你会想要Spring AI、LangChain4j这些完整框架的能力但又不想动老项目。这时候最佳方案是新起一个独立的AI微服务用最新的Spring Boot 3 LangChain4j老项目通过HTTP或RPC调用它。架构图┌─────────────────────┐ HTTP/Feign ┌─────────────────────┐ │ 老项目Spring 4│ ─────────────────── │ AI微服务Spring Boot 3│ │ 业务逻辑/数据库 │ │ LangChain4j / RAG / Agent │ │ 现有功能不变 │ ─────────────────── │ 大模型调用 / 向量检索 │ └─────────────────────┘ JSON响应 └─────────────────────┘老项目侧调用代码FeignSpring 4兼容package com.example.ai; import feign.Headers; import feign.Param; import feign.RequestLine; /** * Feign客户端调用AI微服务Spring 4兼容用feign-core即可 */ public interface AiServiceClient { RequestLine(POST /api/ai/chat) Headers(Content-Type: application/json) String chat(ChatRequest request); class ChatRequest { private String question; private String userId; // getter/setter省略 public String getQuestion() { return question; } public void setQuestion(String question) { this.question question; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId userId; } } }// 在Spring 4项目中配置Feign客户端 package com.example.config; import com.example.ai.AiServiceClient; import feign.Feign; import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class AiServiceConfig { Value(${ai.service.url:[http://localhost:8081](http://localhost:8081)}) private String aiServiceUrl; Bean public AiServiceClient aiServiceClient() { return Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .target(AiServiceClient.class, aiServiceUrl); } }优点AI能力独立演进新技术随便用Spring Boot 3、LangChain4j、流式输出、RAG全上不影响老项目老项目代码几乎不用改独立部署、独立扩容、独立监控AI服务挂了不影响核心业务多个老项目可以共用一个AI微服务缺点多一个服务要运维但现在容器化部署很简单有网络开销内网调用延迟很低可忽略需要处理服务发现、鉴权等微服务基础问题核心判断如果只是简单调大模型问答方案1就够了如果AI功能会持续迭代、越来越复杂直接上方案3一劳永逸。三种方案对比维度方案1OkHttp手写方案2官方SDK方案3微服务拆分依赖侵入性极低仅OkHttpfastjson中SDK传递依赖老项目零侵入改造成本最低复制一个类低引入依赖调用中新起服务接口对接功能完整度基础需自己扩展高官方全功能最高任何框架都能用维护成本低自己控制代码中跟SDK版本升级中多一个服务依赖冲突风险几乎为零有需排查传递依赖零适用场景简单问答、快速接入需要官方高级功能AI功能复杂、长期迭代我的选型建议你只是想给老项目加个智能问答/文案生成功能→ 方案1OkHttp手写半小时搞定最稳妥你需要流式输出、Function Calling等高级功能又不想起新服务→ 方案2官方SDK注意选兼容版本你要做完整的RAG/Agent系统AI功能会持续迭代→ 方案3微服务拆分长期来看最省心你的项目JDK版本特别低JDK 6/7→ 方案1选OkHttp 3.12.x fastjson 1.2.x这是唯一能跑的方案最后说一句不要被新框架必须高版本Spring吓住。大模型的本质就是HTTP接口只要能发HTTP请求任何Java项目都能做AI。先从方案1跑通最小闭环看到效果再决定要不要升级这才是老项目做AI的正确姿势。 落地资源推荐AI应用框架开发需要稳定的测试环境我平时调试框架、跑RAG验证都用阿里云轻量应用服务器2核4G跑SpringBoot 大模型调用完全够用新用户首年特惠性价比很高再加上现在可以领取的9折券适合自己动手搭一个AI测试环境。有部署需求的朋友可以点击查看https://www.aliyun.com/daily-act/ecs/activity_selection?userCodefzoabro9阿里云开发者特惠活动无需求直接忽略即可。 领取完整源码关注图片上水印即Java-AI工程师后台回复【选型】领取本文完整源码含 OkHttp 手写客户端带重试降级、DashScope SDK 调用示例、Feign 微服务调用示例、Spring 4 兼容版本 pom.xml复制到项目直接运行。 下期预告选型踩坑是Java开发者的普遍痛点很多人为了技术而技术盲目上框架最后发现不匹配重构成本极高。所以我们下一篇讲:Java AI 框架选型最容易踩的 5 个坑90% 的人至少中 2 个本文属于「Java AI工具选型」合集

相关推荐

Salt progress 输出器深度解析:用 `--progress` 实时跟踪大规模 minion 返回进度
Salt progress 输出器深度解析:用 `--progress` 实时跟踪大规模 minion 返回进度

运维配置管理后端 【免费下载链接】salt Software to automate the management and configuration of infrastructure and applications at scale. 项目地址: https://gitcode.com/gh_mirrors/sa/salt 点击查看 免费下载 本篇文章围绕 Salt 的 progress 输出模块&a… · 2026/9/24 17:22:07

Instant 2025 年 11 月更新解读:MCP 工具升级、Explorer 数据管理与 Firebase 登录接入
Instant 2025 年 11 月更新解读:MCP 工具升级、Explorer 数据管理与 Firebase 登录接入

后端数据库 【免费下载链接】instant Instant is the best backend for AI-coded apps. You get auth, permissions, storage, presence, and streams — everything you need to ship apps your users will love. 项目地址: https://gitcode.com/gh_mirrors/inst/i… · 2026/9/24 17:22:01

Akka Streams Source.unfoldResource 深度解析:安全封装阻塞式资源为响应式数据源
Akka Streams Source.unfoldResource 深度解析:安全封装阻塞式资源为响应式数据源

Akka Streams Source.unfoldResource 深度解析:安全封装阻塞式资源为响应式数据源 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.… · 2026/9/24 17:22:01

AI文档中台落地实战:从中间件架构到公文合同智能化
AI文档中台落地实战:从中间件架构到公文合同智能化

接手企业数字化建设这几年,我最大的体会是:文档处理是所有业务系统都绕不开、却又最容易被低估的一环。尤其是公文和合同这两类典型的高价值文档,它们格式要求严格、术语密度高、审批链路长,而且出错代价极高。过去我们尝试过让业… · 2026/9/24 20:19:42

C++20 Concepts详解:告别模板报错天书,让约束清晰可读
C++20 Concepts详解:告别模板报错天书,让约束清晰可读

1. 模板报错为什么像天书:先从最痛的地方说我写模板写了几年,最不愿意面对的从来不是模板本身,而是模板实例化失败时那一整屏飘红的编译错误。明明只是把一个不该传进来的类型传给了模板,编译器却能头也不回地钻进标准库内部&… · 2026/9/24 20:19:42

qwen3.8-max接入Windsurf完整教程:从API配置到思考模式与网关实战
qwen3.8-max接入Windsurf完整教程:从API配置到思考模式与网关实战

把 qwen3.8-max 接进 Windsurf,这件事我前前后后折腾了一个下午,踩了三个大坑才跑通。今天把完整过程写成这篇保姆级教程,从 dashscope 的 API 配置、Windsurf 侧的自定义模型接入,到思考模式的几个隐蔽问题,再附带一套… · 2026/9/24 20:19:42

一周搭建带记忆的科研助手:Agent Memory实战指南
一周搭建带记忆的科研助手:Agent Memory实战指南

1. 项目概述:为什么要给Agent装"记忆"先说一个我自己踩过的坑。去年我在做一个自动整理文献的Agent,初版功能很齐全——能读PDF、能提取摘要、能根据关键词生成综述。但用了一周我就发现问题了:每次对话它都像失忆了一样。今天告诉… · 2026/9/24 20:19:42

多平台分发工具团队协作功能对比:四款工具权限管理分析
多平台分发工具团队协作功能对比:四款工具权限管理分析

做新媒体矩阵运营这些年,我见过太多团队选多平台分发工具只看发布速度,忽略了团队协作里的权限管理,最后踩了误操作、数据泄露的坑。权限管理看似是后台小功能,实则直接决定账号安全、协作效率与合规底线。今天就拿四款业内常用的… · 2026/9/24 20:19:42

AI Agent安全工程:模型行为风险、对齐与可控性实践
AI Agent安全工程:模型行为风险、对齐与可控性实践

AI Agent安全工程做到第三篇,我想聊一个最容易被忽视、也最让团队头疼的环节:模型本身。前两篇我们处理的是外部问题——权限边界、工具滥用、提示词注入,这些都还属于"敌人从外面攻进来"的范畴。但真正把Agent放到生产环境里跑过一… · 2026/9/24 20:19:35

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码