Spring (kotlin) 控制器将数据 class 的不可空参数接收为空
Spring (kotlin) controller receives non-nullable parameters of a data class as null
我遇到了意外错误,我不确定如何处理。
我有一个这样的数据class:
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
显然是null。另一方面,对象已创建,其余两个值似乎已正确填充。
如果我添加一个检查空值的 if 语句,ide 会抱怨负载属性永远不会为空,将 if 语句标记为冗余,但实际上情况并非如此。
我的印象是 null 安全属性......好吧...... null 安全。至少我希望在构造对象后发生空指针异常。
我的问题是:
- Spring 如何创建这样的对象
- 为什么在对象构建时没有检测到这个
- "Kotlin" 处理此问题的方法是什么,因为我不想检查假定为 null 的安全对象中的 null 参数。
问题出在 Gson,而不是 Spring。 Gson 设计用于 Java,它在可空类型和不可空类型之间没有*区别,因此 Gson 无论如何都会愉快地分配一个空值。
不幸的是,这里没有灵丹妙药。您可以编写自己的 TypeAdapter which explicitly checks for null values before constructing your data classes, but if you have a lot of classes, that's going to get very repetitive. Alternatively, you could create your own TypeAdapterFactory 并使用 Kotlin 的反射库来检查哪些类型可以为空,哪些不可以,但这会对性能和依赖性产生各种影响。
* 有可空性注解(@Nonnull、@Nullable),但Gson不检查它们。
我遇到了意外错误,我不确定如何处理。
我有一个这样的数据class:
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
显然是null。另一方面,对象已创建,其余两个值似乎已正确填充。
如果我添加一个检查空值的 if 语句,ide 会抱怨负载属性永远不会为空,将 if 语句标记为冗余,但实际上情况并非如此。
我的印象是 null 安全属性......好吧...... null 安全。至少我希望在构造对象后发生空指针异常。
我的问题是:
- Spring 如何创建这样的对象
- 为什么在对象构建时没有检测到这个
- "Kotlin" 处理此问题的方法是什么,因为我不想检查假定为 null 的安全对象中的 null 参数。
问题出在 Gson,而不是 Spring。 Gson 设计用于 Java,它在可空类型和不可空类型之间没有*区别,因此 Gson 无论如何都会愉快地分配一个空值。
不幸的是,这里没有灵丹妙药。您可以编写自己的 TypeAdapter which explicitly checks for null values before constructing your data classes, but if you have a lot of classes, that's going to get very repetitive. Alternatively, you could create your own TypeAdapterFactory 并使用 Kotlin 的反射库来检查哪些类型可以为空,哪些不可以,但这会对性能和依赖性产生各种影响。
* 有可空性注解(@Nonnull、@Nullable),但Gson不检查它们。