Tag: guice

如何在Guice中绑定Kotlin函数

我有一个类似于这样的Kotlin类: class MyClass @Inject constructor(val work: (Int) -> Unit)) { … } bind和@Provides都没有工作: class FunctionModule : AbstractModule() { override fun configure() { bind(object : TypeLiteral<Function1>() {}).toInstance({}) } @Provides fun workFunction(): (Int) -> Unit = { Unit } } } 我不断收到错误: 没有实现kotlin.jvm.functions.Function1 被绑定。 如何使用Guice为Kotlin函数注入实现?

在Multibinder中使用泛型

在使用com.google.inject.multibindings.Multibinder时,我对泛型有点困惑: interface MessageParser<S, T> { fun accept(msg: S): Boolean fun parser(msg: S): T } class Parser1 : MessageParser<Mime, Parsed> class Parser2 : MessageParser<Mime, Parsed> class EmailModule : AbstractModule() { override fun configure() { val parsers = Multibinder.newSetBinder(binder(), MessageParser::class.java) parsers.addBinding().to(Parser1::class.java) parsers.addBinding().to(Parser2::class.java) } } 这工作,但失去了所有的仿制药信息。 是否有可能限制这个解析器的特定子集,即做 val parsers: MessageParser<Mime, Parsed> = Multibinder.newSetBinder(binder(), MessageParser<Mime, Parsed>::class.java) 现在,这会产生一个编译器错误: 只有类允许在类文字的左侧

为什么不是Guice找到我的List <Interface>绑定?

我有一个接口与几个实现: interface PuNoManager { fun notifyUser(userId: Int) } class FcmManager @Inject constructor(val fcmClient: FcmClient) : PuNoManager { override fun notifyUser(userId: Int) { … } } class ApnsManager @Inject constructor(val apnsClient: ApnsClient) : PuNoManager { override fun notifyUser(userId: Int) { … } } 哪些都绑定在我的Module ,以及@Provides -annotated方法来获取List<PuNoManager> : class PuNoModule: AbstractModule() { override fun configure() { bind(ApnsManager::class.java) […]

Spring Data JPA + Guice错误:使用@EnableTransactionManagement注解时,没有类型的主要bean定义

我在Play Framework(Java版本)项目中使用Kotlin 1.1.4-3和Guice和Spring Data JPA 2.0.0.RELEASE。 Play Framework版本是2.5.8。 我使用了spring-projects / spring-guice库,特别是将Spring配置类注册为Guice模块的方法 ,将Spring和Guice集成为Play Framework的DI库。 我将一个接口声明为Spring服务的基础。 语法是Kotlin语言。 interface PersonPresenceManagement { fun autoGenerateOrUpdatePersonPresences(companyInfo: CompanyInfo) fun generatePersonPresence(currentUser: SalaryUser, userId: Long, logPeriodId: Long): Result fun saveOrUpdateDailyReport(currentUser: SalaryUser, personPresenceDbId: Long, dailyReport: DailyReport): Result } 正如Spring Data JPA文档中提到的: 改变交易行为的另一种可能性是使用通常覆盖多个存储库的外观或服务实现。 其目的是为非CRUD操作定义事务边界: 我实现了PersonPresenceManagement接口: @Service open class PersonPresenceManagementImpl @Inject constructor(…) : PersonPresenceManagement { @Transactional override […]

注入构造函数和伴随对象

我对Kotlin是新鲜的,我正在尝试注入一个值(在这个例子中,它只是一个Int,但在真正的代码中它是一个Provider类)我在这里做错了什么? 为什么x是一个未解决的参考? class Test @Inject constructor(private val x: Int) { companion object { var y: Int = 0 @BeforeClass @JvmStatic fun beforeClass() { y = x * 2 } } }

Guice MapBinder

我在Java + Kotlin项目中使用Guice将算法实现的映射注入到特定的bean中,但是我一直在获取 1) No implementation for java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) was bound. while locating java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) for the 2nd parameter of com.scherule.scheduling.SchedulingJobConsumer.<init>(SchedulingJobConsumer.kt:17) while locating com.scherule.scheduling.SchedulingJobConsumer 模块的定义是这样定义的: class AlgorithmsModule : AbstractModule() { override fun configure() { MapBinder.newMapBinder(binder(), String::class.java, SchedulingAlgorithm::class.java, Names.named("scheduling.algorithms") ).addBinding("interval-projection").toInstance(IntervalProjectionAlgorithm()) } } 而来电号码是: @Singleton class SchedulingJobConsumer […]

使用Guice + Kotlin绑定对象列表

我正在使用以下控制器定义在Kotlin中编写JavaFX应用程序: class MainController { @Inject private lateinit var componentDescriptors: List<ComponentDescriptor> /* More code goes here */ } 我正在使用Guice进行依赖管理。 我试图注入通过java.util.ServiceLoader加载的类实例的列表。 我的问题是定义一个绑定,将注入加载的对象实例列表到声明的字段。 我尝试基于注释的供应: internal class MyModule: AbstractModule() { override fun configure() { } @Provides @Singleton fun bindComponentDescriptors(): List<ComponentDescriptor> = ServiceLoader.load(ComponentDescriptor::class.java).toList() } 和多重绑定扩展(在Corse的字段定义中切换列表设置): internal class MyModule: AbstractModule() { override fun configure() { val componentDescriptorBinder = Multibinder.newSetBinder(binder(), ComponentDescriptor::class.java) ServiceLoader.load(ComponentDescriptor::class.java).forEach […]