You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模块Java Spring Boot应用中Bean找不到问题求助

问题:多模块Spring Boot应用无法获取moduleA的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:27:34