свойство lateinit S не было инициализировано - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу ввести синглтон в другой класс kotlin в пружинный ботинок .

S.kt

 @Singleton
 @Component
 class S(
    private val userService: UserService,
    val companyRepo: CompanyRepo
 )

WorkingGroup.kt

    class WorkingGroup(
        override val name: String = "",
        override val desc: String = ""
    ) : Csv() {

        fun isCompatible(ct2: WorkingGroup): Boolean = this == ct2

        companion object : ICsvEnumCompanion<WorkingGroup> {

            @Inject
            private lateinit var s: S

           override val VALUES: List<WorkingGroup>
            by lazy {
                val details = s.user().company.details ?: CompanyDetails()
                details.workingGroups.map { WorkingGroup(it.name, it.desc) }
            }
    }
}

По этому коду я получаю ошибку ниже:

Caused by: org.zalando.problem.DefaultProblem: Internal Server Error: lateinit property s has not been initialized

Я ищу эту ошибку и нашел какой-то результат, например this , но проблема не решена.
Как внедрить службу в сопутствующий объект в котлине?

1 Ответ

0 голосов
/ 18 декабря 2018

Чтобы Spring мог внедрить в объект-компаньон, вам нужно создать установщик для поля вне объекта-компаньона.WorkingGroup должен быть bean-компонентом, управляемым Spring, чтобы Spring мог автоматически связывать его (вставлять зависимости).

@Component
class WorkingGroup(
    override val name: String = "",
    override val desc: String = ""
) : Csv() {

    fun isCompatible(ct2: WorkingGroup): Boolean = this == ct2

    companion object : ICsvEnumCompanion<WorkingGroup> {

        private lateinit var s: S

       override val VALUES: List<WorkingGroup>
        by lazy {
            val details = s.user().company.details ?: CompanyDetails()
            details.workingGroups.map { WorkingGroup(it.name, it.desc) }
        }
   }

   @Autowired
   fun setS(value: S) {
      s = value;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...