首页 文章

Spring(kotlin)控制器接收数据类的非可空参数为null

提问于
浏览
1

我面临一个意外的错误,我不知道如何处理 .

我有一个这样的数据类:

data class Payload (
  @SerializedName("id")
  var id: String
  @SerializedName("type")
  var type: String,
  @SerializedName("data")
  var data: String
)

这是一个简单的Spring控制器:

@PostMapping("/some-endpoint")
fun dataHandler(@RequestBody payload: Payload): String{
    when (payload.type){
        "someType" -> {
            val result = try {
                gson.fromJson(payload.data, payloadData::class.java)
            } catch (e: Exception){
                throw BadDataException("Bad Data")
            }
            payloadProcessor.process(result, payload.id) // NPE here
        }
        "otherType" -> {
            doSomethingElseHere()
        }
    }
}

当执行到达payloadProcessor.process时,由于 id 显然为空,因此发生空指针异常 . 另一方面,创建了对象,并且似乎正确填充了两个剩余值 . 如果我添加一个if语句检查空值,则ide会抱怨有效负载属性永远不为空,将if语句标记为冗余,但实际情况并非如此 . 我的印象是,零安全属性......好......安全无效 . 至少我希望在构造对象后发生空指针异常 .

我的问题是:

  • Spring如何设法创建这样的对象

  • 为什么在对象构造时未检测到这种情况

  • 什么是"Kotlin"处理这个的方法,因为我不想在一个假定的空安全对象中检查空参数 .

1 回答

  • 1

    问题在于Gson,而不是Spring . Gson设计用于Java,它在可空和非可空类型之间没有区别,因此Gson无论如何都会乐意分配一个空值 .

    不幸的是,这里没有神奇的解决方案 . 您可以编写自己的TypeAdapter,它在构造数据类之前显式检查空值,但如果您有很多类,那将会非常重复 . 或者,您可以创建自己的TypeAdapterFactory并使用Kotlin的反射库来检查哪些类型可以为空,哪些不可以,但这会对性能和依赖性产生各种影响 .

    *有可空性注释(@Nonnull,@ Nullable),但Gson不检查它们 .

相关问题