Kotlin - Как предотвратить попадание нуля в объект Map во время десериализации Джексона Джсона? - PullRequest
0 голосов
/ 01 июня 2018

Во-первых, позвольте мне пройти через некоторый исполняемый код, чтобы помочь вам решить проблему, которую я хочу решить:

(зависимость 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)?

1 Ответ

0 голосов
/ 01 июня 2018

IIUC, нулевая безопасность Kotlin - это в основном время компиляции.Ничто не мешает установить null в ненулевое свойство во время выполнения с помощью отражения, поскольку ссылка Kotlin гласит:

... Единственные возможные причины NPEможет быть:

Взаимодействие Java: ... Общие типы, используемые для взаимодействия Java с некорректной обнуляемостью, например, фрагмент кода Java может добавить нуль в Kotlin MutableList, что означает, что для работы с ним следует использовать MutableList;

...