java - 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);
}
}
}
解决方案
推荐阅读
- react-native - React-native:在 20 秒后执行发布请求,即使应用程序在后台运行
- java - 用 Java 重启调制解调器
- api - 如何在使用 Demandware OCAPI 下的订单中添加支付交易状态?
- excel - 使用VBA在excel中过滤两个日期之间的数据
- c++ - 由于链式前缀,Visual Studio 2017 Linux Makefile 项目无法构建
- mysql - 不支持 ejabberd 18.09 和 MySQL 版本
- javascript - 通过正则表达式检查字符串是否仅包含斜杠
- ajax - 使用 Nginx 部署 Django 应用程序后,AJAX POST 请求上的 CSRF 失败
- linux - 为什么 pie 二进制文件中不允许使用“symbol@GOT”?
- jsf - 在 p:schedule 中查找所选期间的开始和结束日期