You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by GitBox <gi...@apache.org> on 2020/03/12 14:58:43 UTC
[GitHub] [pulsar] bastman opened a new issue #6528: JSONSchema Deserializer
does not work with kotlin data classes
bastman opened a new issue #6528: JSONSchema Deserializer does not work with kotlin data classes
URL: https://github.com/apache/pulsar/issues/6528
* producer , consumer example*
The consumer fails with error:
```
Exception in thread "main" org.apache.pulsar.client.api.SchemaSerializationException: org.apache.pulsar.shade.com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `example.simple.SensorReading` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"temperature":1.5}"; line: 1, column: 2]
at org.apache.pulsar.client.impl.schema.reader.JsonReader.read(JsonReader.java:44)
at org.apache.pulsar.client.api.schema.SchemaReader.read(SchemaReader.java:36)
at org.apache.pulsar.client.impl.schema.StructSchema.decode(StructSchema.java:92)
at org.apache.pulsar.client.impl.MessageImpl.getValue(MessageImpl.java:278)
at example.simple.SimpleAppKt.main(SimpleApp.kt:52)
at example.simple.SimpleAppKt.main(SimpleApp.kt)
Caused by: org.apache.pulsar.shade.com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `example.simple.SensorReading` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"temperature":1.5}"; line: 1, column: 2]
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589)
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055)
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297)
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
at org.apache.pulsar.shade.com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3275)
at org.apache.pulsar.client.impl.schema.reader.JsonReader.read(JsonReader.java:42)
```
package example.simple
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.apache.pulsar.client.api.*
import org.apache.pulsar.client.impl.schema.JSONSchema
private const val SERVICE_URL = "pulsar://localhost:6650"
private const val TOPIC_NAME = "test-topic-jsonschema-002"
private const val SUBSCRIPTION_NAME = "test-subscription-001"
private typealias PulsarProducer = Producer<SensorReading>
private typealias PulsarConsumer = Consumer<SensorReading>
data class SensorReading(val temperature: Float)
fun main() {
val schema = JSONSchema.of(SensorReading::class.java)
val client: PulsarClient by lazy {
PulsarClient.builder()
.serviceUrl(SERVICE_URL)
.build()
}
val producer: PulsarProducer = client.newProducer(schema)
.topic(TOPIC_NAME)
.compressionType(CompressionType.LZ4)
.create()
val consumer: PulsarConsumer = client.newConsumer(schema)
.topic(TOPIC_NAME)
.subscriptionType(SubscriptionType.Shared)
.subscriptionName(SUBSCRIPTION_NAME)
.subscribe()
// check json (stringify/parse) works
val JSON = jacksonObjectMapper()
val source = SensorReading(temperature = 2.5f)
val txt = JSON.writeValueAsString(source)
val sink: SensorReading = JSON.readValue(txt)
run {
val content = SensorReading(temperature = 1.5f)
val msg = producer.newMessage()
.value(content)
msg.send()
}
run {
while (true) {
val msg = consumer.receive()
println("received ${msg.messageId}")
val content = msg.value
println("Message received: $content")
// Acknowledge the message so that it can be deleted by the message broker
consumer.acknowledge(msg)
println("Ack sent.")
}
}
}
```
* side notes *
jackson-module-kotlin is not used by the build in objectmapper
Is there any chance to get that supported?
alternative: let's pass in the pre-configured objectmapper as argument of schema factory.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services