02 模块边界:研究卡与拟执行实验(2026-10-04) 问题:采购规则可否从 Web/JDBC 拆离,并在无服务器条件下接入内存 RequestStore? 规范:Jakarta EE Platform 11.0 §8.1.1(模块与独立部署)、§8.2.1、§8.3.1(WAR 类可见性);CDI 4.1、Transactions 2.0(仅用于区分实际受管入口与直接 new);Java SE 21 javax.sql。 源码入口:examples/javaee-enterprise/{domain,application,adapters-jdbc,webapp}/pom.xml;domain/src/main/java/blog/javaee/domain/ProcurementRequest.java;application/src/main/java/blog/javaee/application/{ProcurementUseCases,RequestStore,PriceCatalog}.java;adapters-jdbc/src/main/java/blog/javaee/jdbc/JdbcRequestStore.java;domain/src/test/java/blog/javaee/domain/ProcurementRulesTest.java。 当前读码:RequestStore 由 application 定义、JDBC 适配器实现;use case 带 CDI 与 @Transactional,纯 SE 边界仅覆盖 domain;Web 只有健康和数据库探针,不存在采购 HTTP 入口。当前 use case 将非法状态转成 RequestConflictException,真实 JDBC 的 find 对缺记录或不符租户抛 RequestMissingException。以上是静态读码,不是业务用例运行输出。 已有基础证据:writing-plans/javaee-enterprise/verification/20261004T061900Z-pg16-foundation/build-3.stdout.txt 为 Maven clean verify 成功,health.headers.txt/datasource.headers.txt 均为 HTTP 200;health.body.txt=ready,datasource.body.txt=connected,两个脚本退出码为 0。server-final.stdout.txt 为 Liberty 26.0.0.5 应用启动记录;DB 探针只执行 SELECT current_database()=javaee_lab,绝不等同于内存 RequestStore、审批或事务回滚实验。 拟执行环境:在单独工作副本里增加正文给出的 ProcurementUseCasesBoundaryTest,并给 application/pom.xml 增加测试范围 org.junit.jupiter:junit-jupiter 依赖;本篇提交不修改累计工程。使用 JDK 21、仓库 ../hibernate-lab/mvnw(3.9.9),在 examples/javaee-enterprise 目录运行。采集 java -version、wrapper -v、源码 SHA、起止时间、标准输出/错误、退出码;不使用旧 target 测试报告充当本次证据。 正常用例:纸张 2 件、单价 3.50,断言服务端总额 7.00、draft ID=1、submit 后状态 SUBMITTED;无需服务器与数据库。 失败用例 A:DRAFT 直接 approve,预期 RequestConflictException、键 1 仍为 DRAFT;跨租户 other-tenant 查询/审批,替身模拟真实存储的 RequestMissingException、不改变原状态。 失败用例 B(故意破坏替身):insert 返回 1 但仍把 ID=0 的 request 存入键 1;submit 后更新键 0,断言 find(1).state()==SUBMITTED 预期失败;修复为存储带 ID=1 的新 ProcurementRequest 后复跑。 构建方向用例:../hibernate-lab/mvnw -B -ntp -pl webapp -am dependency:tree;若引入 application -> adapters-jdbc 的 POM 反向依赖,期望 Maven reactor 报循环依赖,绝不修改主工程演示此失败。 记录模板:命令=待执行;代码 SHA=待采集;退出码=待采集;断言输出=待采集;实际包/运行时=未用。正常=NOT_RUN,失败 A/B=NOT_RUN,循环依赖探针=NOT_RUN。即使纯内存测试通过,也不能证明 CDI 拦截、事务回滚、真实跨租户授权与唯一订单。