【问题标题】:Deserializer failing when running in Graal在 Graal 中运行时反序列化程序失败
【发布时间】:2019-09-18 15:19:44
【问题描述】:

我有一个内置到 GraalVM 本机映像中的 Micronaut 应用程序。当我从正常的角度(即没有 Graal)运行应用程序时,它运行完美。

但是,当我尝试从 Graal 运行时,在尝试将字符串反序列化为枚举时出现以下运行时异常:

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)

作为参考,我的反序列化器如下:

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);
    }

}

我认为我可能需要为 Graal 添加一些自定义反射配置,但我不太确定。有人可以在这里阐明一下吗?

【问题讨论】:

  • 也许您可以阅读您的错误消息Class fts.marketing.utils.deserializers.CampaignEmailStatusDeserializer has no default (no arg) constructor 并在您的CampaignEmailStatusDeserializer.class 中添加一个构造函数
  • @Zorglube 你这么说是出于使用 Graal 的经验,还是仅仅通过背诵错误消息?
  • @aris-kortex 这已超出阅读该消息的范围,VM 告诉您它需要一个带零参数的默认构造函数:因此看来您应该尝试在对象中添加一个零参数构造函数。你试过了吗?

标签: java jackson micronaut graalvm graalvm-native-image


【解决方案1】:

经过一番挖掘,问题似乎是由 SubtrateVM 不允许的反射调用引起的。

我为反射调用添加了一个配置文件,其中包含以下条目:

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

并配置要使用的本机图像。这解决了所有问题。

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多