资讯中心

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

📅 2026/9/24 17:22:08
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工具选型」合集

看完文章,想为自己的企业也做一次专业网站诊断?

尧图顾问免费为您评估现有网站,并给出建站/改版建议与报价方案。

免费获取方案