【发布时间】:2014-10-04 20:17:48
【问题描述】:
我发现 kotlin 中的数字是不可序列化的。
- 第一个问题
Device.kt:
package test.domain
import javax.persistence.*
Entity public class Device {
public Id GeneratedValue var id: Long = -1
public var name: String = ""
...
}
DeviceRestRepository.kt:
package test.domain
import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.data.repository.query.Param
import org.springframework.data.rest.core.annotation.RepositoryRestResource
RepositoryRestResource(collectionResourceRel = "device", path = "device")
public trait DeviceRestRepository : PagingAndSortingRepository<Device, Long?> {
public fun findByName(Param("name") name: String): List<Device>
}
当我尝试编译此代码时出现错误,因为 kotlin.Long 不是 Serializable:
错误:(14, 72) Kotlin:类型参数不在其范围内:应该 是 'java.io.Serializable?' 的子类型?
- 第二个问题
我在尝试使用 java.lang.Long 时遇到同样的错误:
DeviceRestRepository.kt:
package test.domain
import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.data.repository.query.Param
import org.springframework.data.rest.core.annotation.RepositoryRestResource
RepositoryRestResource(collectionResourceRel = "device", path = "device")
public trait DeviceRestRepository : PagingAndSortingRepository<Device, java.lang.Long?> {
public fun findByName(Param("name") name: String): List<Device>
}
警告:(14, 72) Kotlin:不应在 Kotlin 中使用此类。利用 kotlin.Long 代替。
错误:(14, 72) Kotlin: 类型参数不是 在其范围内:应该是 'java.io.Serializable?' 的子类型?
【问题讨论】:
-
虽然您的解决方法已经足够好(恭喜您找到它!),但这是 Kotlin 基础架构中的一个问题,我们会尽力解决它。请观看此问题以获取有关我们进度的通知:youtrack.jetbrains.com/issue/KT-5821
-
AndreyPaslavsky 感谢@AndreyBreslav 的解决方法,很高兴听到这将得到解决。如果你能澄清一下为什么 java.lang.Long 从 Kotlin 的角度来看是不可序列化的,而它在 Java 中是可序列化的?谢谢。
-
@beegor,
java.lang.Long不可序列化,因为 Kotlin 将其视为不可序列化的kotlin.Number(不是java.lang.Number)的子类。当 Kotlin 调用 Java 方法时,此映射j.l.Number -> k.Number是使 Kotlin/Java 互操作顺利工作所必需的 -
嗯,虽然此解决方案适用于从数据库读取,但插入新记录无法正常工作,ID 始终为 -1,而不是由 DB (postgresql) 生成。我在这里错过了什么吗?
-
在下面查看我的新答案,这不再是问题。可以审核确认吗?
标签: spring serialization kotlin spring-data-jpa