我正在嘗試使用 kotlin 和 jackson 為 RabbitMQ 實作一個抽象的訊息消??費者。消費者的設定作業正常,所以我在代碼片段中省略了它。問題僅在于將字串有效負載決議為泛型物件。
我的目標是有一個抽象類,如:
abstract class AbstractRetryConsumer<T>(val queueName:String) : MessageListener {
// Autowiring and seting up the Beans
...
override fun onMessage(msg: Message) {
val msgPayload = String(msg.body, Charsets.UTF_8)
// the following line doesn't compile
val readValue = objectMapper.readValue<T>(msgPayload)
processEvent(readValue)
}
abstract fun processEvent(payload: T)
...
}
然后我就可以實作一個像這樣的消費者:
@Service
class NotificationConsumer(
) : AbstractRetryConsumer<Notification>("myQueue") {
// gets the payload as a parsed object
override fun processEvent(payload: Notification) {
println("payload ist: $payload")
}
}
編譯器不會接受。錯誤是: 不能使用“T”作為具體型別引數。改用一個類。
我知道有很多類似的問題,但我沒有找到我的問題的答案。
感謝您的詢問和解答
uj5u.com熱心網友回復:
當使用 Jackson Kotlin 模塊時,物件映射器有一個行內擴展readValue,帶有具體的泛型引數。由于您呼叫objectMapper.readValue<T>(msgPayload)中的引數已具體化,因此您的類AbstractRetryConsumer<T>還需要定義一個具體化的引數T。然而,這意味著你的類必須是行內的,而且它看起來太大而不能行內。因此,您應該在建構式中添加一個 JavaClass 引數并呼叫 的非擴展版本readValue:
val readValue = objectMapper.readValue(msgPayload, payloadClass)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495758.html
上一篇:根據rust函式中的泛型選擇常量
