Инициализация dataManager

Здравствуйте, хочу создать запланированную задачу, в которой будет выполняться определенная логика, но столкнулся с тем, что при попытке вызвать какой-либо метод dataManager’а выскакивает ошибка kotlin.UninitializedPropertyAccessException: lateinit property dataManager has not been initialized. Подскажите, пожалуйста, как ее можно исправить?

@Component("REG_ScheduledTasks")
open class ScheduledTasks {

    @Autowired
    private lateinit var dataManager: DataManager

    companion object {
        private val log = LoggerFactory.getLogger(ScheduledTasks::class.java)
    }

    @Scheduled(fixedDelay = 10, timeUnit = TimeUnit.SECONDS)
    fun runCheckScheduledTasks() {
        log.info("runCheckScheduledTasks: The time is now {}", dateFormat.format(Date()))

        val tasks = dataManager.load(Task::class.java)
            .query("select t from REG_Task t")
            .fetchPlan(FetchPlan.BASE)
            .list()

        println(tasks.size)

        log.info("runCheckScheduledTasks: done.")
    }

}

Здравствуйте.

Попробовал сделать класс с назначенными задачами на основе вашего, и у меня задача по расписанию отрабатывает без проблем.

import com.company.kotlinlateinit.entity.User
import io.jmix.core.DataManager
import io.jmix.core.FetchPlan
import io.jmix.core.security.SystemAuthenticator
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
import java.util.concurrent.TimeUnit

@Component("REG_ScheduledTasks")
open class ScheduledTasks(private val systemAuthenticator: SystemAuthenticator) {

    @Autowired
    private lateinit var dataManager: DataManager

    companion object {
        private val log = LoggerFactory.getLogger(ScheduledTasks::class.java)
    }

    @Scheduled(fixedDelay = 10, timeUnit = TimeUnit.SECONDS)
    fun runCheckScheduledTasks() {
        log.info("Scheduled task started")

        systemAuthenticator.runWithSystem {
            val users = dataManager.load(User::class.java)
                .query("select t from User t")
                .fetchPlan(FetchPlan.BASE)
                .list()
            log.info("Users: {}", users.size)
        }
        log.info("runCheckScheduledTasks: done.")
    }
}

Вот мой проект:
kotlin-lateinit.zip (102.8 КБ)

Здравствуйте! Ваш пример у меня тоже работает, но если использовать аннотацию Authenticated

@Component
open class TestComp {

    @Autowired
    private lateinit var dataManager: DataManager

    @Autowired
    private lateinit var timeSource: TimeSource

    @Authenticated
    @Scheduled(fixedDelay = 10, timeUnit = TimeUnit.SECONDS)
    fun runCheckScheduledTasks() {
        log.info("runCheckScheduledTasks: The time is now ${timeSource.now()}")

        val users = dataManager.load(User::class.java)
            .query("select t from jt_User t")
            .fetchPlan(FetchPlan.BASE)
            .list()

        log.info("runCheckScheduledTasks: Found ${users.size} users")

        log.info("runCheckScheduledTasks: done.")
    }

    companion object {
        private val log = LoggerFactory.getLogger(TestComp::class.java)
    }

}

Падает ошибка.
kotlin.UninitializedPropertyAccessException: lateinit property timeSource has not been initialized
Вопрос почему так происходит)

Если в вашем примере добавить модификатор open к методу, то вроде бы все начинает работать как надо

open fun runCheckScheduledTasks() {

Это, похоже, не новая проблема, возникающая из-за того, что если метод final, то спринг создаёт CGLIB proxy. Вот тут, например, подробно описано.

1 симпатия