如何在Micronaut控制器中注入JobScheduler?
错误信息
Internal Server Error: Failed to inject value for parameter [jobScheduler] of class: com.myapp.http.controllers.MyController
Message: No bean of type [org.jobrunr.scheduling.JobScheduler] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
Path Taken: new ReturnController(JobScheduler jobScheduler) --> new ReturnController([JobScheduler jobScheduler])
已完成的配置
- 依赖:已添加
micronaut-inject-java、org.jobrunr:jobrunr-micronaut-feature:5.2.0 - 控制器代码:
@Controller("/return") class MyController(private val jobScheduler: JobScheduler) { @Post fun create() = jobScheduler.schedule(Instant.now()) { println("scheduled...") } }
- 数据源配置(application.yml):
datasources: default: url: jdbc:postgresql://localhost:5432/postgres driverClassName: org.postgresql.Driver username: postgres password: postgres dialect: POSTGRES
解决方案
1. 显式启用JobRunr特性
Micronaut 3及以上版本需要显式启用第三方特性,在application.yml中添加:
micronaut: features: jobrunr: true
2. 修正Kotlin项目的注解处理器配置
对于Kotlin项目,需确保micronaut-inject-java同时作为annotationProcessor和kapt依赖配置。以Gradle为例,在build.gradle.kts中调整:
dependencies { annotationProcessor("io.micronaut:micronaut-inject-java") kapt("io.micronaut:micronaut-inject-java") implementation("org.jobrunr:jobrunr-micronaut-feature:5.2.0") runtimeOnly("org.postgresql:postgresql") // 确保数据库驱动存在 }
3. 手动注册JobScheduler Bean(自动配置失效时)
如果自动配置未生效,可通过配置类手动创建并注册JobScheduler:
import io.micronaut.context.annotation.Factory import org.jobrunr.configuration.JobRunr import org.jobrunr.scheduling.JobScheduler import javax.sql.DataSource import jakarta.inject.Singleton @Factory class JobRunrConfig { @Singleton fun jobScheduler(dataSource: DataSource): JobScheduler { return JobRunr.configure() .useJobRunrDashboard() // 可选,启用控制台 .useDataSource(dataSource) .initialize() .jobScheduler } }
4. 检查版本兼容性
确保JobRunr Micronaut特性版本与你的Micronaut版本匹配:
- JobRunr 5.x 适配 Micronaut 3.x/4.x
- 若使用Micronaut 2.x,需降级JobRunr至4.x版本
5. 启用日志排查Bean加载问题
添加日志配置查看Bean加载的详细过程,确认是否有条件注解阻止了JobScheduler的创建:
logger: levels: io.micronaut.context.condition: TRACE org.jobrunr: DEBUG
内容的提问来源于stack exchange,提问作者Rafa Acioly

