首页 > 解决方案 > Avro ClassCastException:类 java.net.URL 不能转换为类 java.lang.CharSequence

问题描述

在发送 Kafka 消息时出现以下错误,我正在使用 Apache Avro 架构并获取ClassCastException.

架构:

{
  "namespace": "com.test.model",
  "name": "Event",
  "type": "record",
  "doc": "The 'Approved File Check Passed' domain event.",
  "fields": [
    {
      "name": "name",
      "type": "string",
      "doc": "The name of the file as received from SFT."
    },
    {
      "name": "url",
      "type": {
        "type": "string",
        "java-class": "java.net.URL"
      },
      "doc": "The URL of the file."
    }
    ]
}

日志:

com.test.kafkaproxy.common.util.exception.AvroProcessingException: Error converting Avro GenericRecord to JSON. Record: {"supid": "supid1", "name": "File5Fail.txt", "url": http://localhost:8097/be24f434-de91-4346-8b69-645f54b6a550DebtorID1.200728062447.File5Fail.txt, "receivedTimestamp": 2020-07-29T04:02:24.387Z, "addedTimestamp": 2020-07-29T04:02:24.387Z, "fileFormat": "PIPE_SEPARATED"}
        at com.test.kafkaproxy.common.util.AvroUtils.toJson(AvroUtils.java:94)
        at com.test.kafkaproxy.client.KafkaProxyClient.send(KafkaProxyClient.java:118)
        at com.test.kafkaproxy.client.KafkaProxyClient.send(KafkaProxyClient.java:96)
        at com.test.aif.test.steps.StepDefs.thatTheAIFReceivedEventIsThereInTheKAFKATopic(StepDefs.java:101)
        at ✽.that the AIF received event is there in the KAFKA topic(classpath:com/test/aif/test/AIF.feature:4)
    Caused by: java.lang.ClassCastException: class java.net.URL cannot be cast to class java.lang.CharSequence (java.net.URL and java.lang.CharSequence are in module java.base of loader 'bootstrap')
        at org.apache.avro.generic.GenericDatumWriter.writeString(GenericDatumWriter.java:323)
        at org.apache.avro.generic.GenericDatumWriter.writeString(GenericDatumWriter.java:315)
        at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:150)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:82)
        at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:206)
        at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:195)
        at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:130)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:82)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:72)
        at com.test.kafkaproxy.common.util.AvroUtils.toJson(AvroUtils.java:88)
        at com.test.kafkaproxy.client.KafkaProxyClient.send(KafkaProxyClient.java:118)
        at com.test.kafkaproxy.client.KafkaProxyClient.send(KafkaProxyClient.java:96)
        at com.test.aif.test.steps.StepDefs.thatTheAIFReceivedEventIsThereInTheKAFKATopic(StepDefs.java:101)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.cucumber.java.Invoker.invoke(Invoker.java:27)
        at io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:27)
        at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
        at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:64)
        at io.cucumber.core.runner.TestStep.run(TestStep.java:49)
        at io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:46)
        at io.cucumber.core.runner.TestCase.run(TestCase.java:51)
        at io.cucumber.core.runner.Runner.runPickle(Runner.java:66)
        at io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.runTestCase(CucumberEngineExecutionContext.java:84)
        at io.cucumber.junit.platform.engine.PickleDescriptor.execute(PickleDescriptor.java:38)
        at io.cucumber.junit.platform.engine.PickleDescriptor.execute(PickleDescriptor.java:22)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
        at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
        at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
        at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
        at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

请找到将 Avro 转换为 Json 的类和方法 toJson 抛出异常:

public final class AvroUtils {
    private AvroUtils() {
    }

    public static <T extends IndexedRecord> T fromJson(String value, String schema, boolean specific) {
        try {
            Schema schemaObj = (new Parser()).parse(schema);
            JsonDecoder jsonDecoder = DecoderFactory.get().jsonDecoder(schemaObj, value);
            DatumReader<T> datumReader = specific ? new SpecificDatumReader(schemaObj) : new GenericDatumReader(schemaObj);
            return (IndexedRecord)((DatumReader)datumReader).read((Object)null, jsonDecoder);
        } catch (Exception var6) {
            throw new AvroProcessingException("Error loading Avro from JSON. JSON: " + value + " Schema: " + schema, var6);
        }
    }

    public static String toJson(IndexedRecord record) {
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            JsonEncoder jsonEncoder = EncoderFactory.get().jsonEncoder(record.getSchema(), outputStream);
            SpecificDatumWriter<IndexedRecord> genericRecordSpecificDatumWriter = new SpecificDatumWriter(record.getSchema());
            genericRecordSpecificDatumWriter.getData().addLogicalTypeConversion(new DateConversion());
            genericRecordSpecificDatumWriter.getData().addLogicalTypeConversion(new TimeMicrosConversion());
            genericRecordSpecificDatumWriter.getData().addLogicalTypeConversion(new TimeMillisConversion());
            genericRecordSpecificDatumWriter.getData().addLogicalTypeConversion(new TimestampMicrosConversion());
            genericRecordSpecificDatumWriter.getData().addLogicalTypeConversion(new TimestampMillisConversion());
            genericRecordSpecificDatumWriter.getData().addLogicalTypeConversion(new DecimalConversion());
            genericRecordSpecificDatumWriter.getData().addLogicalTypeConversion(new UUIDConversion());
            genericRecordSpecificDatumWriter.write(record, jsonEncoder);
            jsonEncoder.flush();
            return new String(outputStream.toByteArray());
        } catch (Exception var4) {
            throw new AvroProcessingException("Error converting Avro GenericRecord to JSON. Record: " + record, var4);
        }
    }
}

标签: javaspring-bootapache-kafkaavro

解决方案


推荐阅读