2014-10-04 31 views
5

Zauważyłem, że liczby w kotlinach nie można szeregować.Liczby w kotlinach nie można szeregować

  1. Pierwszy problem

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> 
} 

pojawia się błąd przy próbie kompilacji tego kodu, ponieważ kotlin.Long nie jest Serializable:

Error:(14, 72) Kotlin: Type argument is not within its bounds: should be subtype of 'java.io.Serializable?'

  1. Drugi problem

uzyskać ten sam błąd, gdy próbuję użyć 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> 
} 

Warning:(14, 72) Kotlin: This class shouldn't be used in Kotlin. Use kotlin.Long instead.

Error:(14, 72) Kotlin: Type argument is not within its bounds: should be subtype of 'java.io.Serializable?'

+1

Mimo że Twoje obejście jest wystarczająco dobre (i gratulujemy znalezienia!), Jest to problem w infrastrukturze Kotlin, a my dołożymy wszelkich starań, aby to naprawić. Proszę obejrzeć ten problem, aby uzyskać powiadomienie o naszych postępach: https://youtrack.jetbrains.com/issue/KT-5821 –

+0

AndreyPaslavsky dzięki za obejście problemu, @AndreyBreslav, cieszymy się, że to zostanie rozwiązane. A jeśli możesz proszę wyjaśnić, dlaczego java.lang.Long nie jest Serializowalny z perspektywy Kotlina, podczas gdy jest Serializowalny w Javie? Dzięki. – beegor

+0

@beegor, 'java.lang.Long' nie jest możliwy do serializacji, ponieważ Kotlin widzi go jako podklasę' kotlin.Number' (nie 'java.lang.Number'), której nie można serializować. To odwzorowanie 'j.l.Number -> k.Numer "jest niezbędny, aby interakcja Kotlin/Java działała sprawnie, gdy Kotlin wywołuje metody Java –

Odpowiedz

0

Natknąłem się na ten sam problem i udało mi się z nim poradzić poprzez posiadanie moich interfejsów repozytorium w java, gdzie podałem java.lang.Long jako ogólny typ argumentu dla id. Reszta pozostała w Kotlin (klas danych, klas usług, etc.)

1

znalazłem obejście tego problemu:

Device.kt:

package test.domain 

import javax.persistence.* 

Entity public class Device { 
    public EmbeddedId var id: DeviceId = DeviceId() 
    public var name: String = "" 
    ... 
} 

Embeddable public class DeviceId: Serializable { 
    public GeneratedValue var id: Long = -1 
} 

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, DeviceId?> { 
    public fun findByName(Param("name") name: String): List<Device> 
} 

Ten przypadek działa dobrze