多模块Java Spring Boot应用中Bean找不到问题求助
我搭建了一个多模块Java Spring Boot应用,以moduleB的Main方法作为入口。其中KafkaListener作为Kafka监听器,需要调用moduleA中的ModuleAEventHandler。未来可能会添加更多供KafkaListener调用的模块,但目前运行应用时出现报错:No bean named 'moduleAEventHandler' available。
项目结构
modules/ - moduleA/ - ModuleAEventHandler.java - pom.xml - moduleB/ - Main.java - KafkaListener.java - pom.xml
代码片段
moduleA/ModuleAEventHandler.java
@Component @AllArgsConstructor public class ModuleAEventHandler implements EventHandler { private static final Logger logger = LoggerFactory.getLogger(ModuleAEventHandler.class); @Override public Result<Object> handleEvent(Object event, String eventType) { logger.info("Processing create event: {}", event); return Result.ok(event); } }
moduleB/Main.java
@SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
moduleB/KafkaListener.java(仅展示注解部分)
@Configuration @EnableConfigurationProperties @ConfigurationProperties("consumer") @Data public class KafkaMessageListener { ... }
moduleB/pom.xml依赖
<dependency> <groupId>com.company.app</groupId> <artifactId>moduleA</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
调试信息
我添加了调试方法遍历所有Bean名称,但未发现任何来自moduleA的Bean:
@PostConstruct public void debugBeans() { String[] beanNames = applicationContext.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(">>>>> " + beanName); } }
1. 让Spring扫描到moduleA的组件
@SpringBootApplication默认只扫描当前类所在包及其子包的组件。如果moduleA的包路径和moduleB的Main类包不重叠,Spring找不到ModuleAEventHandler这个@Component。
修改moduleB的Main类,添加@ComponentScan指定moduleA的包:
@SpringBootApplication @ComponentScan(basePackages = {"com.company.app.moduleA", "com.company.app.moduleB"}) public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
如果两个模块都在同一个根包(比如com.company.app)下,直接指定根包更省事。
2. 检查moduleA的打包配置
确认moduleA的pom.xml中打包方式是jar(默认就是,但如果设成pom会导致依赖失效):
<packaging>jar</packaging>
3. 用依赖注入替代手动获取Bean(更推荐)
别用applicationContext.getBean()硬拿Bean,直接用依赖注入,既符合Spring规范,也能避免扫描问题:
@Configuration @EnableConfigurationProperties @ConfigurationProperties("consumer") @Data public class KafkaMessageListener { private final ModuleAEventHandler moduleAEventHandler; // 处理消息时直接调用 public void processMessage(Object event, String eventType) { moduleAEventHandler.handleEvent(event, eventType); } }
以后要加更多EventHandler的话,可以用@Autowired List<EventHandler>自动注入所有实现类,再根据eventType匹配对应的Handler,扩展性更好。
4. 验证依赖是否正确引入
执行mvn dependency:tree检查moduleB是否成功引入moduleA的jar包,排除依赖冲突或版本不一致的问题。
内容的提问来源于stack exchange,提问作者johnny_mac

