Во-первых, позвольте мне пройти через некоторый исполняемый код, чтобы помочь вам решить проблему, которую я хочу решить:
(зависимость maven включена, если вы хотите запустить этот пример кода)
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.9.4.1</version>
</dependency>
просто создайте файл Kotlin и вставьте ниже исполняемый код в:
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
data class MapObject(val map: Map<String, String>, val age: Int)
data class SimpleObject(val name:String, val age: Int)
data class MapSimpleObject(val map: SimpleObject, val age: Int)
fun main(args: Array<String>) {
val mapper = jacksonObjectMapper()
val mObj: MapObject = mapper.readValue("""{"map": {"name": null}, "age": 1}""")
println(mObj) // mObj can be created, print "MapObject(map={name=null}, age=1)", which is not nice
val msObj: MapSimpleObject = mapper.readValue("""{"map": {"name": null, "age": 1}, "age": 1}""")
println(msObj) // throw MissingKotlinParameterException at line above, which is nice
val sObj: SimpleObject = mapper.readValue("""{"name": null, "age": 1}""")
println(sObj) // throw MissingKotlinParameterException at line above, which is nice
// val m: Map<String, Int> = mapOf(null to 2) // won't compile, which is nice
}
Как видите, специально для val mObj: MapObject
, даже MapObject
s map
- это карта, определенная в Kotlin с Non-Нет типов, все еще можно создать объект с полезной нагрузкой Json, такой как {"map": {"name": null}, "age": 1}
, в результате объект mObj
получится как MapObject(map={name=null}, age=1)
Это не то, что я хотел, я хотел бы, чтобы нулевая функция безопасности Kotlin захватила этои выдать мне несколько исключений, если я поставлю json payload так.
Так как же я могу убедиться, что null
не внедрено, если у меня есть структура класса данных, такая как data class MapObject(val map: Map<String, String>, val age: Int)
?