常见问题
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、安全配置和测试。最终目录不是把所有逻辑堆在几个文件里,而是形成了 controller、service、mapper、entity、dto、config、exception、security、common、vo 等职责明确的包。
这一步的效率价值在于,开发者不需要先机械地创建几十个 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,再调试任务和分类接口。对一个限时后端项目而言,这让"生成代码"向"可验证接口"多走了一步。
七、怎么评价这次生成效率?
优点
-
55 分钟覆盖的是完整闭环。 计时没有停在文件生成,而是包含检查、修复、打包、启动和 Swagger 加载。
-
工程骨架比较完整。 39 个 Java 主源码文件覆盖分层、DTO/VO、安全、异常、分页和 OpenAPI,不是几个 Controller 拼出的演示代码。
-
权限边界落在后端。 当前用户来自 JWT,上下游查询带用户条件,跨用户任务和分类操作进入了自动化测试。
-
测试给最终结果增加了可信度。 14 项测试全部通过,且覆盖注册登录、非法鉴权、CRUD、分页筛选、关联约束和越权访问。
-
复现成本低。 H2、演示数据和 Swagger 让项目启动后可以较快进入接口验证,不需要先准备外部数据库。
不足
-
缺少严格的相对效率对照。 本次没有用相同需求做纯手写或升级前版本测试,因此只能证明 55 分钟完成度,不能证明模型升级究竟带来了多少相对增幅。
-
没有分阶段耗时。 分析、首轮生成、修复、构建和人工操作分别用了多久没有完整记录,无法判断 55 分钟中哪一段最值得继续优化。
-
无法评价首次通过率和代码采纳率。 现有证据证明最终测试和打包通过,但没有记录首次编译错误数,也没有逐行统计人工采纳比例。
-
Token 异常的诊断信息偏少。
JwtAuthenticationFilter捕获运行时异常后直接清空上下文,客户端语义统一,但服务端排查过期、签名错误或格式错误时缺少分类诊断。更稳妥的做法是记录不含 Token 内容的安全审计信息。 -
任务列表存在潜在 N+1 查询。
TaskService.toView()会按每条任务再次查询分类。当前演示数据量很小,影响不明显;数据量扩大后,应通过关联查询、批量加载或缓存映射减少查询次数。 -
本地配置不能直接上生产。 默认 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