由于传递给id:spring boot、kotlin、mongodb的null值,读取HTTP消息失败



我对kotlin编程和mongodb完全陌生。我正在定义一个数据类,它的所有数据字段都不是可为null的,所有文件都是val

data class Order( @Id
val id: String,
val customerId: String,
val externalTransactionId : String,
val quoteId :String,
val manifestItems : List<ManifestItem>,
val externalTokenNumber : String,
val deliveryId : String,
val quoteCreatedTime: String,
val deliveryCreatedTime: String,
val status : String,
val deliveryInfo: DeliveryInfo,
val pickupInfo: PickupInfo,
val riderId : String,
val currency : String,
val expiryTime : String,
val trackingUrl : String,
val complete:Boolean,
val updated:String
) 

我正在发送一个http请求,其中包含以下正文

{
"pickupAddress":"101 Market St, San Francisco, CA 94105",
"deliveryAddress":"101 Market St, San Francisco, CA 94105",
"deliveryExpectedTime":"2018-07-25T23:31:38Z",
"deliveryAddressLatitude":7.234,
"deliveryAddressLongitude":80.000,
"pickupLatitude":7.344,
"pickupLongitude":8.00,
"pickupReadyTime":""
} 

在我的路由器类中,我得到了订单对象的请求主体,并将其发送到服务类

val request = serverRequest.awaitBody<Order>()
val quoteResponse =  quoteService.createQuote(request,customerId)

在我的服务类中,我将订单保存到数据库

suspend fun createQuote(order: Order,customerId:String):QuoteResponse {
ordersRepo.save(order).awaitFirst()
//generating quote response here
return quoteResponse
}

id正在数据库中生成。我在发送请求时遇到了这种错误

org.springframework.web.server.ServerWebInputException: 400 BAD_REQUEST "Failed to read HTTP message"; nested exception is org.springframework.core.codec.DecodingException: JSON decoding error: Instantiation of [simple type, class basepackage.repo.Order] value failed for JSON property id due to missing (therefore NULL) value for creator parameter id which is a non-nullable type; nested exception is com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class basepackage.repo.Order] value failed for JSON property id due to missing (therefore NULL) value for creator parameter id which is a non-nullable type
at [Source: (org.springframework.core.io.buffer.DefaultDataBuffer$DefaultDataBufferInputStream); line: 12, column: 1] (through reference chain: basepackage.repo.Order["id"])

我该如何克服那个问题。

如果你使用mongoDB,你需要使用ObjectID而不是String,它不能自己生成,你需要每次都创建它!

以下代码可能是一个解决方案:


data class Order constructor(
@Id
@field:JsonSerialize(using = ToStringSerializer::class)
@field:JsonProperty(access = JsonProperty.Access.READ_ONLY)
var id: ObjectId?,
val customerId: String,
val externalTransactionId: String,
val quoteId: String,
val manifestItems: List<ManifestItem>,
val externalTokenNumber: String,
val deliveryId: String,
val quoteCreatedTime: String,
val deliveryCreatedTime: String,
val status: String,
val deliveryInfo: DeliveryInfo,
val pickupInfo: PickupInfo,
val riderId: String,
val currency: String,
val expiryTime: String,
val trackingUrl: String,
val complete: Boolean,
val updated: String
) 
  • 我将val转换为var,它允许您在序列化后为其设置值,将访问设置为READ_ONLY,Jackson不再期望id作为输入
  • 如果您喜欢id为String,ToStringSerializer是可选的

最新更新