我有一个 Micronaut 控制器,它将
java.time.Clock
作为依赖项:
@Controller("/foo")
class FooListener (
private val clock: Clock,
) {
// ...
}
IntelliJ 警告:
不满足的依赖关系:没有bean与注入点匹配
检验信息: 报告 Bean 类中缺少或不明确依赖项的注入点。
并且应用程序未启动:
Error starting Micronaut server: Bean definition [FooListener] could not be loaded: Failed to inject value for parameter [clock] of class: FooListener
Message: No bean of type [java.time.Clock] exists.
我在主应用程序实例中尝试了
@PostConstruct
:
object Application {
@JvmStatic
fun main(args: Array<String>) {
Micronaut.build()
.eagerInitSingletons(true)
.eagerInitConfiguration(true)
.mainClass(Application.javaClass)
.start()
}
@PostConstruct
fun onStart(context: ApplicationContext) {
context.registerSingleton(Clock::class.java, Clock.systemUTC())
}
}
但这似乎被忽视了;也许
main
中的代码首先运行,并且问题发生在 @PostConstruct
运行之前。
添加这个小包装类也没有帮助:
class ClockConfig {
@Bean
fun clock(): Clock = Clock.systemUTC()
}
当我将
@io.micronaut.context.annotation.Configuration
添加到该 ClockConfig
类时,编译器会抱怨“此注释不适用于目标‘类’”,并且看起来它适用于包。
如何将时钟放入应用程序上下文中,并将
Clock.systemUTC()
作为值?
看起来工厂就可以做到这一点:
import io.micronaut.context.annotation.Factory
import jakarta.inject.Singleton
import java.time.Clock
@Factory
class ClockFactory {
@Singleton
fun clock(): Clock = Clock.systemUTC()
}