55分钟能用飞算JavaAI搭完JWT REST API吗?

常见问题

Q:飞算JavaAI在JWT REST API场景中表现如何?

A:飞算JavaAI在JWT REST API场景中能生成可运行的核心代码,关键逻辑如并发控制、数据校验等处理较为合理,但复杂边界条件仍需人工补充。

一、为什么这次不测"几秒写完一个 Controller"?

让 AI 生成一个 Entity、Controller 或普通 CRUD,已经不算新鲜。真正消耗 Java 开发时间的,通常是把这些代码组合成一个能运行的工程:依赖是否完整、Spring Security 会不会拦错接口、JWT 能否签发和解析、密码有没有正确加密、DTO 校验和异常响应是否统一、分页查询能否工作,以及用户 A 能不能越权读取用户 B 的数据。

所以这次我选择了一个范围不大、但工程链路比较完整的项目------TaskFlow 轻量任务管理 REST API。它包含用户、分类、任务三张表,要求实现注册登录、JWT 鉴权、任务 CRUD、分页筛选、分类管理、统一响应、全局异常处理、Swagger 文档和 MockMvc 测试。

我的判断标准不是"模型输出了多少代码",而是:55 分钟结束时,我拿到的是代码片段,还是一个能够构建、启动、测试和查看接口文档的 Java 工程?

二、测试环境与计时规则

|----------|-------------------------------------------|
| 项目 | 本次实测配置 |
| 操作系统 | macOS 26.6.1,Apple Silicon(arm64) |
| IDE | IntelliJ IDEA 2024.1.7,Build 241.19416.15 |
| 飞算JavaAI | 3.9.8,专家模型 |
| 项目 Java | JDK 17 |
| Maven | 3.9.16 |
| 后端框架 | Spring Boot 3.2.12 |
| 数据访问 | MyBatis-Plus 3.5.7 |
| 鉴权 | Spring Security + JJWT 0.11.5 |
| 数据库 | H2 2.2.224 内存数据库 |
| API 文档 | SpringDoc OpenAPI 2.3.0 + Swagger UI |
| 自动化测试 | JUnit 5 + MockMvc |
| 计时起点 | 完整需求提交给飞算JavaAI |
| 计时终点 | 工程生成与修复完成、构建启动成功、Swagger UI 打开 |
| 端到端耗时 | 55 分钟 |

这里有两点口径需要提前说明。

第一,55 分钟来自测试过程中的外部连续计时,包含模型分析、文件生成、检查修复、构建、启动和 Swagger 验收,不是"纯代码生成耗时"。截图中的"思考 21s""思考 14s"等只是部分对话节点,不能相加替代总计时。

第二,项目的 Maven 编译目标和测试运行环境均为 JDK 17。项目自带的验证脚本会显式选择 JDK 17,Surefire 报告记录的实际测试运行时为 Java 17.0.20。这样可以避免本机安装多个 JDK 时,被终端默认版本干扰结论。

三、我给飞算JavaAI的需求有多完整?

我没有只输入"帮我写一个任务管理系统",而是把技术栈、数据模型、接口和工程规范一次说明清楚。这样做的目的,是尽量把测试变量收敛到模型的工程实现能力,而不是让模型猜业务。

图 1:提示词上半部分锁定了 JDK、Spring Boot、JWT、MyBatis-Plus、H2、Swagger,以及用户、分类和任务三类数据模型。

图 2:提示词下半部分继续规定了 11 个业务接口、数据归属、统一响应、异常处理和自动化测试。

核心需求可以概括为:

复制代码

请从零生成一个可直接运行的 Spring Boot 3 项目 taskflow-api。 技术栈:JDK 17、Maven、Spring Security、JWT、MyBatis-Plus、 H2、SpringDoc OpenAPI、Validation、JUnit 5 和 MockMvc。 数据模型:用户、分类、任务三张表。任务包含状态、优先级、 截止时间、所属分类和所属用户。 认证接口:注册、登录并返回 JWT。 任务接口:创建、更新、删除、详情、分页筛选列表、单独修改状态。 分类接口:创建、查询自己的分类、删除分类。 所有业务接口都要校验用户身份,用户只能操作自己的任务和分类。 工程采用 controller/service/mapper/entity/dto/config/exception 分层, DTO 与 Entity 分离,统一返回 {code, message, data},密码使用 BCrypt, 并为认证和任务模块编写 JUnit + MockMvc 测试。

这份需求最终明确列出了 11 个业务接口:认证 2 个、任务 6 个、分类 3 个。项目还额外提供了 1 个健康检查接口,但我没有把它混进业务功能覆盖率里凑数。

四、55 分钟的实测过程

从提示词进入完整工程生成

提交需求后,专家模型先搭建 Maven 工程和基础配置,再补实体、Mapper、Service、Controller、安全配置和测试。最终目录不是把所有逻辑堆在几个文件里,而是形成了 controllerservicemapperentitydtoconfigexceptionsecuritycommonvo 等职责明确的包。

这一步的效率价值在于,开发者不需要先机械地创建几十个 Java 文件、反复填写包名和依赖,再开始处理业务。模型直接把工作推进到了"检查工程边界和运行结果"的阶段。

生成之后还有检查和修复

这次过程并不是"提示词发出后,模型一轮输出就结束"。从过程记录看,专家模型继续检查了启动配置、Mapper 扫描、H2 初始化、JWT 密钥、实体映射、异常分支和测试覆盖,并对发现的问题做了定点处理。

图 3:专家模型在生成核心源码后继续检查构建配置、启动入口、H2 表结构、实体映射和安全配置。

这也是本次比较明显的效率体感:模型没有停在"代码已经给你了",而是围绕同一个工作区继续读文件、核对依赖关系和补齐测试。反过来说,这张图也证明本次不是"零修复生成"。由于没有单独记录首次编译结果,本文只对最终验证状态负责,不声称首次编译或首次测试就已通过。

工程在 IDEA 中成功启动

完成修复后,Spring Boot 应用成功运行在 8080 端口。截图中可以同时看到 TaskFlow 的分层目录、应用入口、飞算JavaAI 工作区和 Tomcat / DispatcherServlet 日志。

图 4:生成后的 TaskFlow 工程在 IDEA 中启动,终端显示 DispatcherServlet 初始化完成,SpringDoc OpenAPI 开始加载。

启动成功比"代码看起来完整"更有说服力,因为 Spring Bean 注入、Mapper 扫描、数据库初始化和安全过滤链的问题,往往只有真正拉起应用后才会暴露。

Swagger UI 形成接口验收入口

应用启动后,Swagger UI 能正确加载,页面按"任务管理、分类管理、认证管理"分组展示接口,并出现 Bearer JWT 的 Authorize 入口。页面还生成了请求 DTO、响应对象和分页结构等 Schema。

图 5:Swagger UI 展示了 6 个任务接口、3 个分类接口、2 个认证接口及相关 Schema。

这张截图证明 OpenAPI 文档已经随应用加载,11 个业务接口均进入文档。需要区分的是:接口出现在 Swagger 页面,不等于每个接口都已经逐一完成人工 HTTP 调用。 本文对注册、登录、鉴权、CRUD、筛选和越权边界的正确性判断,主要来自后面的 14 项自动化测试结果。

H2 降低了复现门槛

项目选择 H2 内存数据库,启动时自动建表并初始化两个相互隔离的演示用户及其分类、任务,因此复现者不必先安装 MySQL。

图 6:H2 Console 连接入口。截图中的 jdbc:h2:~/test 是控制台表单的默认值,并不是 TaskFlow 的实际数据源地址。

TaskFlow 实际使用的 JDBC URL 是:

jdbc:h2:mem:taskflow;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

连接用户名为 sa,密码为空。数据只存在于当前应用进程中,停止应用后会清空,因此它适合演示和自动化测试,不应被误认为生产数据库方案。

五、55 分钟最终交付了什么?

我对最终工作区、Maven 构建产物和 Surefire 报告做了核对,结果如下:

|----------------|-----------------------|--------------------|
| 量化指标 | 实测结果 | 证据口径 |
| 端到端耗时 | 55 分钟 | 外部连续计时 |
| Java 主源码文件 | 39 个 | src/main/java 文件统计 |
| Java 测试文件 | 5 个 | src/test/java 文件统计 |
| 自动化测试 | 14 项 | Surefire 汇总 |
| 测试失败 / 错误 | 0 failures / 0 errors | Surefire 报告 |
| 业务接口 | 11 个 | 认证 2 + 任务 6 + 分类 3 |
| 接口清单覆盖 | 11/11(100%) | 只按明确接口清单统计 |
| 健康检查接口 | 1 个 | 不计入业务接口覆盖率 |
| 数据表 | 3 张 | 用户、分类、任务 |
| Maven 打包 | 成功 | 已生成可执行 Jar |
| Spring Boot 启动 | 成功 | IDEA 运行日志截图 |
| Swagger UI | 成功加载 | 接口与 Schema 截图 |
| 首次编译是否通过 | 未单独记录 | 不作结论 |
| 代码采纳率 | 未逐行记录 | 不虚构百分比 |

这里的"接口清单覆盖 100%"只表示提示词明确要求的 11 条路由都已经实现,不代表性能、安全和生产化程度达到 100%。这是功能数量口径,不是质量总分。

14 项测试覆盖的不是简单 contextLoads 一项,而是包括:

  • 应用上下文和三张表可用;

  • 两个演示用户的数据分别初始化;

  • 注册成功、字段脱敏、重复用户名和邮箱冲突;

  • 用户名、密码和邮箱参数校验;

  • 登录返回 Bearer JWT,用户名不存在和密码错误使用同一提示;

  • 无 Token、非法 Token 访问业务接口返回 401;

  • Swagger 和健康检查无需认证即可访问;

  • 任务创建、详情、更新、状态修改和删除;

  • 任务分页、状态/优先级筛选和截止时间排序;

  • 用户不能读取、修改或删除其他用户的任务;

  • 用户不能绑定或删除其他用户的分类;

  • 分类被任务引用时禁止删除。

六、关键代码检查:不只看文件数量

JWT 在进入 Controller 前建立认证上下文

安全过滤器从 Authorization 请求头读取 Bearer Token,解析后还会查询数据库,确认用户仍然存在且用户名一致,再写入 Spring Security 上下文:

java 复制代码
String authorization = request.getHeader("Authorization");
if (StringUtils.hasText(authorization)
        && authorization.startsWith("Bearer ")
        && SecurityContextHolder.getContext().getAuthentication() == null) {
    try {
        CurrentUser tokenUser = jwtService.parseToken(
                authorization.substring(7).trim());
        User storedUser = userMapper.selectById(tokenUser.id());
        if (storedUser != null
                && storedUser.getUsername().equals(tokenUser.username())) {
            CurrentUser principal = new CurrentUser(
                    storedUser.getId(), storedUser.getUsername());
            SecurityContextHolder.getContext().setAuthentication(
                    new UsernamePasswordAuthenticationToken(
                            principal, null, List.of()));
        }
    } catch (RuntimeException ignored) {
        SecurityContextHolder.clearContext();
    }
}

工程意义在于,后续 Service 不需要相信客户端传来的 userId。无效或过期 Token 不会建立认证,最终由统一的认证失败处理返回结构化 401。

密码使用 BCrypt,登录失败不泄露账号是否存在

注册时保存的是密码哈希,登录时无论用户不存在还是密码错误,外部都得到相同提示:

java 复制代码
user.setPassword(passwordEncoder.encode(request.password()));

User user = userMapper.selectOne(
        new LambdaQueryWrapper<User>().eq(User::getUsername, username));
if (user == null
        || !passwordEncoder.matches(request.password(), user.getPassword())) {
    throw new BusinessException(
            HttpStatus.UNAUTHORIZED, "用户名或密码错误");
}

这避免了明文密码存储,也减少了登录接口泄露用户名存在性的风险。响应 VO 不包含密码字段,对应测试也明确断言注册响应没有 password

数据隔离不是前端隐藏按钮,而是查询条件带当前用户

查询任务时,Service 同时使用任务 ID 和当前用户 ID:

java 复制代码
private Task findOwned(long id, long userId) {
    Task task = taskMapper.selectOne(new LambdaQueryWrapper<Task>()
            .eq(Task::getId, id)
            .eq(Task::getUserId, userId));
    if (task == null) {
        throw new ResourceNotFoundException("任务不存在");
    }
    return task;
}

其他用户访问时返回 404,而不是先查出资源再返回"无权限",可以减少资源 ID 是否存在的信息泄露。创建或更新任务时,如果携带 categoryId,也会按"分类 ID + 当前用户 ID"验证归属。

分页、筛选和稳定排序进入了 Mapper

任务列表不是把全表数据拉到内存再过滤,而是在 SQL 中限定当前用户、状态和优先级,并把无截止时间的任务放到最后:

复制代码

WHERE user_id = #{userId} <if test="status != null">AND status = #{status}</if> <if test="priority != null">AND priority = #{priority}</if> ORDER BY CASE WHEN due_at IS NULL THEN 1 ELSE 0 END ASC, due_at ASC, created_at DESC, id DESC

对应测试创建两个用户和多条不同截止时间的任务,验证分页、筛选、顺序以及数据隔离,而不是只检查 HTTP 200。

统一异常避免把堆栈直接暴露给客户端

全局异常处理器区分参数错误、业务冲突、路由不存在和未知异常。未知异常记录服务端上下文,对外只返回"服务器内部错误";统一响应保持 {code, message, data} 结构。

Swagger 配置则定义了 HTTP Bearer JWT 安全方案,使开发者可以登录后在 Authorize 中填写 Token,再调试任务和分类接口。对一个限时后端项目而言,这让"生成代码"向"可验证接口"多走了一步。

七、怎么评价这次生成效率?

优点

  1. 55 分钟覆盖的是完整闭环。 计时没有停在文件生成,而是包含检查、修复、打包、启动和 Swagger 加载。

  2. 工程骨架比较完整。 39 个 Java 主源码文件覆盖分层、DTO/VO、安全、异常、分页和 OpenAPI,不是几个 Controller 拼出的演示代码。

  3. 权限边界落在后端。 当前用户来自 JWT,上下游查询带用户条件,跨用户任务和分类操作进入了自动化测试。

  4. 测试给最终结果增加了可信度。 14 项测试全部通过,且覆盖注册登录、非法鉴权、CRUD、分页筛选、关联约束和越权访问。

  5. 复现成本低。 H2、演示数据和 Swagger 让项目启动后可以较快进入接口验证,不需要先准备外部数据库。

不足

  1. 缺少严格的相对效率对照。 本次没有用相同需求做纯手写或升级前版本测试,因此只能证明 55 分钟完成度,不能证明模型升级究竟带来了多少相对增幅。

  2. 没有分阶段耗时。 分析、首轮生成、修复、构建和人工操作分别用了多久没有完整记录,无法判断 55 分钟中哪一段最值得继续优化。

  3. 无法评价首次通过率和代码采纳率。 现有证据证明最终测试和打包通过,但没有记录首次编译错误数,也没有逐行统计人工采纳比例。

  4. Token 异常的诊断信息偏少。 JwtAuthenticationFilter 捕获运行时异常后直接清空上下文,客户端语义统一,但服务端排查过期、签名错误或格式错误时缺少分类诊断。更稳妥的做法是记录不含 Token 内容的安全审计信息。

  5. 任务列表存在潜在 N+1 查询。 TaskService.toView() 会按每条任务再次查询分类。当前演示数据量很小,影响不明显;数据量扩大后,应通过关联查询、批量加载或缓存映射减少查询次数。

  6. 本地配置不能直接上生产。 默认 JWT 密钥、H2 Console、演示账号和内存数据库都只适合本地测试。项目也还没有刷新令牌、注销、限流、审计、性能测试和正式数据库迁移。

我的建议

对开发者:使用 AI 生成 Java 工程时,提示词应同时锁定技术栈、权限边界和验收命令。生成结束后至少执行测试、打包、启动和真实接口验证;不要只看目录树或 Swagger 列表就判断项目可用。

对飞算JavaAI:可以在任务结束时自动给出"分析---生成---修复---构建---启动"的分段耗时,并保存首次构建结果。若还能生成一份区分"静态检查""自动化测试""人工接口验收"的事实报告,效率实测会更容易复现,也更不容易把最终状态误写成首次状态。

八、结论:55 分钟能完成后端样板工程,但不能跳过审查

回到标题:55 分钟用飞算JavaAI从零搭一个带 JWT 认证的 REST API,能完成到什么程度?

本次实测给出的答案是:可以完成一个能够构建、启动和查看 Swagger 文档的 TaskFlow 后端样板工程;它包含11个业务接口、39个Java主源码文件、三张数据表、JWT 与 BCrypt、用户级任务/分类隔离、分页筛选、统一异常响应,以及14项全部通过的自动化测试。

对我而言,最明显的提速体感不是某个方法几秒生成,而是项目更早进入了"运行---测试---发现问题---继续修复"的阶段。大量目录搭建、配置、DTO、Mapper、响应包装和测试样板被压缩到了同一段连续工作流中。

但这个结论有清晰边界:没有对照组,就不能说快了几倍;最终测试通过,也不能反推首次生成没有问题;H2 和默认密钥能够降低演示门槛,却不等于生产可用。AI 把工程推进得更快,开发者仍要对安全、数据库、性能、日志、测试证据和上线风险负责。

如果你的目标是快速搭建内部工具、接口原型或后端 MVP,飞算JavaAI 3.9.8 的专家模型确实能把不少机械工作提前完成。至于项目能否上线,最终判断标准仍然不是生成了多少文件,而是代码审查、自动化测试、真实接口验收和生产化改造能否经得住检查。


标签:#飞算JavaAI #AI编程 #Java #Java代码生成 #AIcoding模型 #Java开发 #SpringBoot #CRUD #JWT #MyBatisPlus

延伸阅读

相关推荐
努力就够了1 小时前
搭建属于自己的 AI 智能体以及多 Agent 协作
springboot·ai agent·ai 智能体·多 agent 协作
书源3 小时前
AI 时代写给前端同行:什么在贬值,什么在涨价
前端·程序员·ai编程
wangruofeng3 小时前
新 Mac 到手先装什么:AI Builder 的 44 款工具,基础层照抄、场景层按需
github·aigc·ai编程
程序员老刘4 小时前
被400次配置逼疯后,我开源了个小工具
开源·ai编程
殷紫川4 小时前
微信 + 支付宝账单一键对账:用 TRAE Work 5 分钟搞定月度家庭财务分析
ai编程·trae
Nturmoils4 小时前
一份Token Plan套餐接通 Claude Code 和 Codex:国产模型统一额度池实测指南
ai编程
名不经传的养虾人4 小时前
从0到1:企业级AI项目迭代日记 Vol.90|Agent变快了,Judge定下来了
大数据·数据库·人工智能·ai编程·企业ai
郑州光合科技余经理4 小时前
海外版多语言团购系统架构:主数据互通与核销边界
java·开发语言·前端·后端·系统架构·php·ai编程