# 代码审查报告 **文件:** `data\demo-pmd\src\com\demo\codestyle\extra\EJBNamingDemo.java` **语言:** java **耗时:** 213.0s **分析工具:** pmd --- 总计: 11 | 错误: 3 | 警告: 2 | 建议: 6 静态分析 · 8 个问题 - 🔴 `pmd:SystemPrintln` L35 第 35 行:使用了 System.out/err 输出。 建议: 避免直接使用 System.out.println,改用日志框架;例如使用 java.util.logging.Logger。 - 🟡 `pmd:AtLeastOneConstructor` L22 第 22 行:每个类应至少声明一个构造器。 建议: 为 MissingBeanSuffix 添加 public 无参构造器(如 public MissingBeanSuffix() {}),不要依赖编译器生成的默认构造器。 - 🔵 `pmd:UnnecessaryImport` L11 第 11 行:重复导入 'javax.ejb.EJBObject'。 建议: 删除第 11 行重复的 import javax.ejb.EJBObject,只保留第 8 行的一次导入。 - 🔵 `pmd:LocalHomeNamingConvention` L14 第 14 行:会话 EJB 的本地 Home 接口应以 LocalHome 作为后缀。 建议: 将接口名从 MissingLocalHomeSuffixBean 改为 MissingLocalHomeSuffixLocalHome,使其以 LocalHome 结尾。 - 🔵 `pmd:LocalInterfaceSessionNamingConvention` L18 第 18 行:会话 EJB 的本地接口应以 Local 作为后缀。 建议: 将接口名从 MissingLocalSuffixBean 改为 MissingLocalSuffixLocal,使其以 Local 结尾。 - 🔵 `pmd:MDBAndSessionBeanNamingConvention` L22 第 22 行:SessionBean/MessageBean 实现类应以 Bean 作为后缀。 建议: 将类名从 MissingBeanSuffix 改为 MissingSuffixBean,使其以 Bean 结尾。 - 🔵 `pmd:RemoteInterfaceNamingConvention` L26 第 26 行:会话 EJB 的远程接口不应带有后缀。 建议: 将接口名从 BadSuffixSession 改为 BadSuffix,去掉 Session 后缀。 - 🔵 `pmd:RemoteSessionInterfaceNamingConvention` L30 第 30 行:会话 EJB 的远程 Home 接口应以 Home 作为后缀。 建议: 将接口名从 MissingHomeSuffixEJB 改为 MissingHomeSuffixHome,使其以 Home 结尾。 AI 审查 · 3 条建议 - 🔴 [AI] [bug] `multiple-public-top-level-types` L14 **一个源文件中存在多个 public 顶层类型** 第 14、18、22、26、30 行都声明了 public 顶层接口/类。Java 规定每个编译单元只能有一个 public 顶层类型,且源文件名必须与该 public 类型名一致,否则编译失败。 建议: 将每个 public 类型拆分为独立的 .java 文件(文件名与类型名一致);若这些类型不需要外部访问,可将除一个之外的 public 改为包私有。 - 🔴 [AI] [bug] `session-bean-methods-not-implemented` L22 **SessionBean 实现类缺少必需的方法** MissingBeanSuffix 是具体类,实现了 javax.ejb.SessionBean,但没有实现接口要求的方法(ejbActivate、ejbPassivate、ejbRemove、setSessionContext),导致编译失败。 建议: 补全这四个方法的空实现。由于 EJB Bean 类不能是 abstract,不能通过改为抽象类来绕过。 - 🟡 [AI] [design] `deprecated-ejb-2-api` L22 **使用了已废弃的 EJB 2.x SessionBean API** MissingBeanSuffix 实现的是 javax.ejb.SessionBean,这是 EJB 2.x 时代的接口;同时 Home/Object 接口也是 EJB 2.x 模式,这类 API 在现代 EJB 容器中已过时。 建议: 如有条件,迁移到 EJB 3.x:在 Bean 类上使用 @Stateless/@Stateful 注解,并通过 @Local/@Remote 注解暴露业务接口,避免实现大量回调方法和手工维护 Home/Component 接口。