gpt4 book ai didi

Spring(kotlin) Controller 接收数据类的不可为空的参数为空

转载 作者:行者123 更新时间:2023-12-02 13:37:30 30 4
gpt4 key购买 nike

我面临一个意外错误,我不确定如何处理。

我有一个这样的数据类:

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

还有一个像这样的简单 Spring Controller :
@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 语句标记为冗余,但实际上并非如此。
我的印象是 null 安全属性是……嗯…… null 安全的。至少我希望在构造对象后会发生空指针异常。

我的问题是:
  • Spring 是如何创建这样一个对象的
  • 为什么在对象构造时未检测到
  • 处理这个问题的“Kotlin”方法是什么,因为我不想检查一个所谓的空安全对象中的空参数。
  • 最佳答案

    问题在于 Gson,而不是 Spring。 Gson 是为与 Java 一起使用而设计的,Java 没有*可空类型和不可空类型之间的区别,因此 Gson 无论如何都会愉快地分配一个空值。

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

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

    关于Spring(kotlin) Controller 接收数据类的不可为空的参数为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53163464/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com