文章目录写在前面一、先看成品AI Agent帮你干了什么二、环境搭建15分钟搞定脚手架2.1 创建Spring Boot项目2.2 配置application.yml2.3 准备一张测试表三、定义AI Agent的交互协议3.1 请求结构3.2 响应结构3.3 Prompt构建器四、调用AI服务生成代码五、代码写入服务六、实战演示生成完整的商品管理模块七、踩坑记录3个你可能也遇到的八、总结写在前面上周团队接了一个紧急需求一周内要交付一个包含8张表的商品管理系统。传统开发至少2个人干满5天。我们试了一个新方案——Java后端用AI Agent自动生成代码人只做审查和微调。结果2天交付Bug率反而比手写低。这篇文章把这套方案完整拆开给你看。从环境搭建到代码生成到部署验证每一步都有可复现的代码。环境Spring Boot 3.3.0 JDK 21 Maven 3.9 MySQL 8.0。一、先看成品AI Agent帮你干了什么开始之前先搞清楚Agent能代替你做什么、不能代替什么。Agent能做的读取已有项目的实体类、Repository接口 → 理解表结构和数据层根据需求生成完整的Service层代码含业务逻辑、事务管理、异常处理生成RestController含参数校验、分页、统一响应格式自动写单元测试覆盖CRUD基本场景如果需要新依赖自动建议Maven坐标Agent做不了的需要你判断的业务规则比如订单金额超过5000需要审批这种规则Agent不知道架构决策该不该拆微服务、该用哪种缓存策略权限策略角色继承、数据行权限记住这个边界后面不会掉坑里。二、环境搭建15分钟搞定脚手架2.1 创建Spring Boot项目在IDEA里 New Project → Spring Initializr选JDK 21Spring Boot 3.3.0依赖勾选Spring Web、Spring Data JPA、MySQL Driver、Lombok、Spring Boot DevTools、Spring Validation项目名ai-agent-crud-demo2.2 配置application.ymlspring:datasource:url:jdbc:mysql://localhost:3306/ai_agent_demo?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8mb4username:rootpassword:yourpassworddriver-class-name:com.mysql.cj.jdbc.Driverjpa:hibernate:ddl-auto:updateshow-sql:falseproperties:hibernate:format_sql:truedialect:org.hibernate.dialect.MySQLDialectserver:port:8080启动项目确认控制台输出 “Started AiAgentCrudDemoApplication”环境就绪。2.3 准备一张测试表CREATETABLEproduct(idBIGINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(200)NOTNULLCOMMENT商品名称,descriptionTEXTCOMMENT商品描述,priceDECIMAL(10,2)NOTNULLCOMMENT价格,stockINTNOTNULLDEFAULT0COMMENT库存,categoryVARCHAR(100)COMMENT分类,statusTINYINTDEFAULT1COMMENT状态1-上架 0-下架,create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,update_timeDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,INDEXidx_category(category),INDEXidx_status(status))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT商品表;三、定义AI Agent的交互协议这部分是核心。我们不绑任何特定AI产品定义一套通用的请求/响应格式方便你替换任意AI服务。3.1 请求结构packagecom.example.aiagent.dto;importlombok.Data;importjava.util.List;DatapublicclassAgentRequest{// 需求描述privateStringrequirement;// 目标生成类型SERVICE / CONTROLLER / REPOSITORY / TESTprivateStringtargetType;// 关联的实体类源代码让AI知道表结构privateStringentityCode;// 已有的Repository代码让AI知道数据层接口privateStringrepositoryCode;// 已存在的依赖列表privateListStringexistingDependencies;}3.2 响应结构packagecom.example.aiagent.dto;importlombok.Data;importjava.util.List;DatapublicclassAgentResponse{// 生成的完整代码privateStringgeneratedCode;// 建议的文件路径如 service/ProductService.javaprivateStringsuggestedFilePath;// 需要新增的Maven依赖privateListStringnewDependencies;// AI对代码逻辑的简要说明privateStringexplanation;}3.3 Prompt构建器packagecom.example.aiagent.service;importcom.example.aiagent.dto.AgentRequest;importorg.springframework.stereotype.Component;ComponentpublicclassPromptBuilder{publicStringbuild(AgentRequestrequest){StringBuilderpromptnewStringBuilder();prompt.append(你是一个Spring Boot 3.x开发专家。请根据以下信息生成Java代码。\n\n);prompt.append(## 项目环境\n);prompt.append(- Spring Boot 3.3.0\n);prompt.append(- JDK 21\n);prompt.append(- 使用Spring Data JPA\n);prompt.append(- 包路径com.example.aiagent\n);prompt.append(- 已有依赖String.join(, ,request.getExistingDependencies())\n\n);prompt.append(## 实体类代码\njava\n);prompt.append(request.getEntityCode());prompt.append(\n\n\n);if(request.getRepositoryCode()!null){prompt.append(## Repository层代码\njava\n);prompt.append(request.getRepositoryCode());prompt.append(\n\n\n);}prompt.append(## 生成要求\n);prompt.append(请生成request.getTargetType()层代码。\n);prompt.append(需求request.getRequirement()\n\n);prompt.append(## 规范要求\n);prompt.append(1. 代码必须完整可运行包含所有import语句\n);prompt.append(2. 使用Transactional注解管理事务\n);prompt.append(3. Service层需包含完整的参数校验和异常处理\n);prompt.append(4. Controller层使用统一的ResponseEntity包装返回\n);prompt.append(5. 分页接口使用Spring Data的Pageable\n);prompt.append(6. 所有数据库操作优先使用已有的Repository方法\n);prompt.append(7. 如果需要新的Maven依赖在代码最后以注释形式列出\n);prompt.append(8. 只返回代码不要解释\n);returnprompt.toString();}}四、调用AI服务生成代码以下是AI服务调用层的核心实现。callAiApi方法的实现取决于你使用的AI服务这里用通用的HTTP调用方式示意。packagecom.example.aiagent.service;importcom.example.aiagent.dto.AgentRequest;importcom.example.aiagent.dto.AgentResponse;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Service;importjava.net.URI;importjava.net.http.HttpClient;importjava.net.http.HttpRequest;importjava.net.http.HttpResponse;importjava.util.ArrayList;importjava.util.List;ServicepublicclassAgentService{Value(${ai.api.endpoint})privateStringapiEndpoint;Value(${ai.api.key})privateStringapiKey;privatefinalPromptBuilderpromptBuilder;privatefinalCodeWriterServicecodeWriter;privatefinalObjectMapperobjectMapper;publicAgentService(PromptBuilderpromptBuilder,CodeWriterServicecodeWriter){this.promptBuilderpromptBuilder;this.codeWritercodeWriter;this.objectMappernewObjectMapper();}publicAgentResponsegenerateAndWrite(AgentRequestrequest)throwsException{// 1. 构建promptStringpromptpromptBuilder.build(request);// 2. 调用AI APIStringrawCodecallAiApi(prompt);// 3. 解析依赖建议ListStringdependenciesextractDependencies(rawCode);// 4. 构建响应AgentResponseresponsenewAgentResponse();response.setGeneratedCode(cleanCode(rawCode));response.setSuggestedFilePath(buildPath(request.getTargetType(),Product));response.setNewDependencies(dependencies);response.setExplanation(代码已生成请检查业务逻辑和异常处理);// 5. 写入文件codeWriter.writeToFile(response);returnresponse;}privateStringcallAiApi(Stringprompt)throwsException{// OpenAI兼容的调用方式StringrequestBodyString.format( { model: gpt-4o, messages: [ {role: system, content: 你是一个Spring Boot开发助手。只返回代码不要解释。}, {role: user, content: %s} ], temperature: 0.2 } ,prompt.replace(\,\\\).replace(\n,\\n));HttpClientclientHttpClient.newHttpClient();HttpRequestrequestHttpRequest.newBuilder().uri(URI.create(apiEndpoint)).header(Content-Type,application/json).header(Authorization,Bearer apiKey).POST(HttpRequest.BodyPublishers.ofString(requestBody)).build();HttpResponseStringresponseclient.send(request,HttpResponse.BodyHandlers.ofString());JsonNoderootobjectMapper.readTree(response.body());returnroot.path(choices).get(0).path(message).path(content).asText();}privateStringcleanCode(Stringraw){returnraw.replaceAll(java\\n?,).replaceAll(\\n?,).trim();}privateListStringextractDependencies(Stringraw){ListStringdepsnewArrayList();for(Stringline:raw.split(\n)){if(line.contains(建议添加依赖)||line.contains(Maven依赖)){deps.add(line.replaceAll(//.*依赖[:],).trim());}}returndeps;}privateStringbuildPath(StringtargetType,StringentityName){returnswitch(targetType){caseSERVICE-service/entityNameService.java;caseCONTROLLER-controller/entityNameController.java;caseREPOSITORY-repository/entityNameRepository.java;caseTEST-service/entityNameServiceTest.java;default-thrownewIllegalArgumentException(不支持的类型targetType);};}}五、代码写入服务packagecom.example.aiagent.service;importcom.example.aiagent.dto.AgentResponse;importorg.springframework.stereotype.Service;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;ServicepublicclassCodeWriterService{privatestaticfinalStringBASE_PATHsrc/main/java/com/example/aiagent/;publicvoidwriteToFile(AgentResponseresponse)throwsIOException{PathfilePathPaths.get(BASE_PATHresponse.getSuggestedFilePath());Files.createDirectories(filePath.getParent());Files.writeString(filePath,response.getGeneratedCode());System.out.println(✓ 代码已写入filePath.toAbsolutePath());if(response.getNewDependencies()!null!response.getNewDependencies().isEmpty()){System.out.println(⚠ 需要手动添加以下Maven依赖);response.getNewDependencies().forEach(dep-System.out.println( - dep));}}}六、实战演示生成完整的商品管理模块配置好AI服务的API地址和Key后通过application.yml或环境变量编写一个启动入口测试packagecom.example.aiagent;importcom.example.aiagent.dto.AgentRequest;importcom.example.aiagent.service.AgentService;importorg.springframework.boot.CommandLineRunner;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importjava.util.List;SpringBootApplicationpublicclassAiAgentCrudDemoApplicationimplementsCommandLineRunner{privatefinalAgentServiceagentService;publicAiAgentCrudDemoApplication(AgentServiceagentService){this.agentServiceagentService;}publicstaticvoidmain(String[]args){SpringApplication.run(AiAgentCrudDemoApplication.class,args);}Overridepublicvoidrun(String...args)throwsException{// 第一步生成Service层AgentRequestserviceRequestnewAgentRequest();serviceRequest.setTargetType(SERVICE);serviceRequest.setRequirement( 生成ProductService包含 1. 商品创建校验名称和价格不为空价格必须0 2. 商品列表查询支持按分类筛选、按名称模糊搜索、分页 3. 商品更新只更新非null字段库存不能为负数 4. 商品删除逻辑删除将status改为0 5. 库存预警查询查询库存10的商品 );serviceRequest.setEntityCode( Entity Table(name product) Data public class Product { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String name; private String description; private BigDecimal price; private Integer stock; private String category; private Integer status; private LocalDateTime createTime; private LocalDateTime updateTime; } );serviceRequest.setExistingDependencies(List.of(spring-boot-starter-data-jpa,spring-boot-starter-web,lombok));agentService.generateAndWrite(serviceRequest);System.out.println(✓ Service层生成完成);// 第二步生成Controller层AgentRequestcontrollerRequestnewAgentRequest();controllerRequest.setTargetType(CONTROLLER);controllerRequest.setRequirement( 生成ProductController路径/api/products 接口 - POST / 创建商品 - GET / 查询商品列表keyword/category/page/size参数 - GET /{id} 查询商品详情 - PUT /{id} 更新商品 - DELETE /{id} 逻辑删除商品 - GET /low-stock 库存预警查询 要求使用Valid校验、统一用ResponseEntity封装 );controllerRequest.setEntityCode(同上实际使用时读取Product.java文件内容);controllerRequest.setExistingDependencies(List.of(spring-boot-starter-data-jpa,spring-boot-starter-web,lombok,spring-boot-starter-validation));agentService.generateAndWrite(controllerRequest);System.out.println(✓ Controller层生成完成);}}跑一遍AI Agent会自动生成ProductService.java和ProductController.java写入项目的对应目录。七、踩坑记录3个你可能也遇到的使用AI Agent生成代码时有几个一定要手动补的坑。坑1Transactional经常漏。AI生成的Service方法经常忘记加事务注解。解决方案在所有涉及写操作的Service方法上手动加上Transactional(rollbackFor Exception.class)。如果涉及多表级联操作这个不能忘。坑2JPA查询方法名可能跑不通。AI生成的Repository方法名有时不符合Spring Data的命名规范。比如它可能给你生成findByProductName而不是findByName。解决生成后立即编译一次有报错就修正方法名或直接加上Query注解明确写SQL。坑3Controller参数校验不完整。AI不会自动给Request类加NotNull、Min(0)等校验注解。用户传一个负数价格进来直接就存数据库了。解决在生成的Request类上手动加上Spring Validation的注解Controller方法参数前加Valid。八、总结用这套方案我把一个8张表的CRUD系统从5天压缩到2天。核心收益不是少写代码而是把精力从重复劳动转移到架构设计和代码审查上。如果你正在用Spring Boot做CRUD密集的项目建议花一个下午把这套Agent框架搭好。一次投入长期复用。有问题评论区交流。如果这篇对你有帮助点赞收藏支持一下我下一篇写《AI生成SQL的9个安全漏洞》。