Kotlin 和 Spring boot,瞬态属性未正确初始化

Lor*_*ill 5 nullpointerexception spring-data-jpa kotlin spring-boot

我将 Spring Boot 与 DDD 应用程序一起使用,其中每个聚合根实体都有一个名为 events 的瞬态字段,该字段不会保留在数据库中:

@MappedSuperclass
abstract class AggregateRoot<TId>(id: TId) : DomainModel<TId>(id) {

    @Transient
    private var events : MutableList<DomainEvent> = mutableListOf()

    fun occurredEvents(): List<DomainEvent>{
        val events = this.events.toMutableList()
        this.events.clear()
        return events
    }

    fun addEvent(event: DomainEvent){
        events.add(event)
    }

    fun removeEvent(event: DomainEvent){
        events.remove(event)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我自己编写添加新实体时,它工作得很好。但是,当我从存储库中使用查找器方法加载实体时,瞬态属性事件似乎为空,而不是可变列表。这给了我一个空指针异常,我花了一段时间才找出发生这种情况的原因。

我尝试将其更改为 Lateinit 属性,但它不起作用。到目前为止,我唯一的解决方法是为每个涉及事件的方法添加一个 null 检查并初始化它,但这个解决方案不是最优的(有趣的是,当我用 Maven 打包它时,它警告我 null 的条件始终是假的,但它恰好是真的):

if(events == null) events = mutableListOf()
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来处理这个问题?也许@Transient 是这里的问题?或者也许自定义初始值设定项会有所帮助?有人知道如何以良好而优雅的 Kotlin 方式解决这个问题,而不是愚蠢的空检查吗?

men*_*urg -1

将初始化移至单独的方法中并用 进行注释@PostConstruct