Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deserializer failing when running in Graal

I have a Micronaut application that builds into a GraalVM native image. When I run the application from a normal standpoint (i.e. no Graal) it runs perfectly.

However when I try to run from Graal I get the following runtime exception when trying to deserialize a String into an enum:

org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition queue.mes.tm_email_processing_result-0 at offset 57. If needed, please seek past the record to continue consumption.
Caused by: io.micronaut.core.serialize.exceptions.SerializationException: Error deserializing object from JSON: Class fts.marketing.utils.deserializers.CampaignEmailStatusDeserializer has no default (no arg) constructor
 at [Source: (byte[])"{"merchant":"Lab6","customerId":729441,"campaignRunId":51,"status":"Sent","messageKey":"70bb5454-8e22-4b37-bba7-83c0dd0cb66f"}"; line: 1, column: 1]
    at io.micronaut.jackson.serialize.JacksonObjectSerializer.deserialize(JacksonObjectSerializer.java:70)
    at io.micronaut.configuration.kafka.serde.JsonSerde.deserialize(JsonSerde.java:79)
    at org.apache.kafka.common.serialization.Deserializer.deserialize(Deserializer.java:60)
    at org.apache.kafka.clients.consumer.internals.Fetcher.parseRecord(Fetcher.java:1264)
    at org.apache.kafka.clients.consumer.internals.Fetcher.access$3600(Fetcher.java:124)
    at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.fetchRecords(Fetcher.java:1488)
    at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.access$1600(Fetcher.java:1328)
    at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:641)
    at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:602)
    at org.apache.kafka.clients.consumer.KafkaConsumer.pollForFetches(KafkaConsumer.java:1294)
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1225)
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1201)
    at io.micronaut.configuration.kafka.processor.KafkaConsumerProcessor.lambda$process$7(KafkaConsumerProcessor.java:393)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460)
    at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)

For reference my deserializer is the following:

public class CampaignEmailStatusDeserializer extends JsonDeserializer<CampaignEmailStatus> {

    @Override
    public CampaignEmailStatus deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String readValue = p.getText();
        if (readValue == null) {
            return CampaignEmailStatus.UNKNOWN;
    }

        return Arrays.stream(CampaignEmailStatus.values())
        .filter(status -> status.getDisplayName().equals(readValue))
        .findAny()
        .orElse(CampaignEmailStatus.UNKNOWN);
    }

}

I think that I might need to add some custom reflection configuration for Graal but I'm not really sure. Can anyone shed some light here?

like image 256
akortex Avatar asked Dec 14 '25 05:12

akortex


1 Answers

After a bit of digging it seems that the problem was attributed from a reflective call that was being disallowed by SubtrateVM.

I added a configuration file for reflective calls containing the following entry:

{
    "name": "fts.marketing.utils.deserializers.CampaignEmailStatusDeserializer",
    "allDeclaredConstructors" : true,
    "allPublicConstructors" : true,
    "allDeclaredMethods" : true,
    "allPublicMethods" : true,
    "allDeclaredClasses" : true,
    "allPublicClasses" : true
  }

and configured the native image to use this resolved all issues.

like image 94
akortex Avatar answered Dec 16 '25 20:12

akortex



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!