当前位置: 首页 > 知识库问答 >
问题:

如何绑定两个kotlin文件

刘意
2023-03-14

我在Java和Kotlin的一个项目中工作。这个项目最初只使用java语言。我正在将一些类迁移到kotlin。但在我迁移到科特林的这门课上,我遇到了这个问题。此问题存在于配置文件中。

配置文件。

package com.fourtwenty.core

import ...
class CoreModule : AbstractModule() {
    override fun configure() {
        // Repositories
        bind(AppRepository::class.java).to(AppRepositoryImpl::class.java)
        ...
        // Services
        bind(AuthenticationService::class.java).to(AuthenticationServiceImpl::class.java)

BindingClassImpl

package com.fourtwenty.core.services.mgmt.impl


import ...
open class AuthenticationServiceImpl @Inject constructor(token: Provider<ConnectAuthToken>) : AbstractAuthServiceImpl(token), AuthenticationService {
    @Inject
    private val metrcAccountRepository: MetrcAccountRepository? = null

    @Inject
    private val stripeService: StripeService? = null

    @Inject
    var integrationSettingRepository: IntegrationSettingRepository? = null

    @Inject
    private val shopPaymentOptionRepository: ShopPaymentOptionRepository? = null

    @Inject
    private val amazonServiceManager: AmazonServiceManager? = null
    ...

绑定类

package com.fourtwenty.core.services.mgmt

import ...

interface AuthenticationService {
    fun getCurrentActiveEmployee(): InitialLoginResult?
    fun adminLogin(request: EmailLoginRequest?): InitialLoginResult?
    ...

我在IntellIJ中发现了这个错误

1) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.metrcAccountRepository cannot be final.
  at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)

2) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.stripeService cannot be final.
  at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)

3) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.shopPaymentOptionRepository cannot be final.
  at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)

4) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.amazonServiceManager cannot be final.
  at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
5) ...

共有1个答案

斜宁
2023-03-14

我从来没有使用过Guice(我假设这是Guice,因为它没有标记),但与spring一样出现了同样的问题,因此应该应用相同的解决方案。

这些字段是val,因此在初始化为null后,DI框架无法修改它们。

它们需要变成var,以便以后可以更新。

除此之外,您可能确定这些字段中的大多数或所有字段都不会为null,因此可以使用lateinit关键字绕过冗长的null性检查。事实上,由于lateinit关键字的存在,DI是提到的主要用例之一:https://kotlinlang.org/docs/properties.html#late-初始化的属性和变量

所以它会变成:

private lateinit var metrcAccountRepository: MetrcAccountRepository

请注意,一个更干净的替代方案(使用val)是执行构造函数注入,如果可能的话。

 类似资料:
  • 我需要在主控制器中绑定来自不同fxml的控件。我有3个fxml文件,分别名为MainView.fxml、ChildView1.fxml和ChildView2.fxml。 mainview.fxml ChildView1.fxml 默认情况下,从ChildView1Controller禁用button1。 我希望在我的另一个视图(ChildView2.fxml)中的表行被选中时启用它。同样,在取消选

  • 我试图在回收器视图中使用数据绑定,我有问题。在data-variable上,我不能选择真正的类型(相反,我可以选择type作为默认包。然后我不能访问适配器类上的变量。我在适配器上得到的错误是:binding.curmovie=movie。我得到的错误是:不能访问类movieItem检查模块类路径是否缺少或冲突的依赖关系绑定 movieitem.kt文件 list_item.xml文件 moviea

  • 我在gradle项目中有多个绑定(xjb文件)。为xsd(C.xsd)生成JAXB类时。我想使用以前为A.xjb生成的绑定文件 如果我在相同的路径中没有任何其他绑定,但是我想要指定显式A.xjb,那么下面的ant xjc任务可以工作 } 谢了拉维

  • 我有一个JavaFX 8应用程序,希望允许一个任务修改两个不同的UI元素。据我所知,如果我有一个标签要修改,我可以用mylabel绑定到标签。textProperty()。绑定(mytask.messageProperty())并在任务中使用updateMessage()。 如何使用两种不同的任意类型执行此操作?我已经查看了并发和JavaFX文档中的示例,但对我来说,它们并没有很好地解释这一点。

  • 我有一个复选框,它在后端绑定了两个值。我的问题是,仅仅绑定了一个值,而将另一个值作为空值传递,也就是我的tmpltid。我如何在Thymleaf中绑定两个隐藏值,不用担心,我有一个getter和setter方法。我只需要把前面的值传过去。救命啊!!! 我的代码与此类似,但没有人对此给出答案

  • 我有两个xml文件,需要将它们合并为一个xml。以下是示例: orginal.xml文件: 使现代化xml文件: 它们应合并为如下xml文件: 实际上,我想使用更新。xml来更新原始。xml: > update.xml中的新员工应该被添加到original.xml 在更新中修改了员工信息。xml应覆盖相应的员工节点。 我对XSLT略知一二,但我的知识还不足以找出适合合并的XSLT。