У меня есть приложение весенней загрузки.
Я также использую org.apache.avro.
У меня есть конечная точка, которая принимает строку и пытается десериализовать ее следующим образом:
public <T> T fromJson(Class<T> type, String string) {
SpecificDatumReader<T> reader = new SpecificDatumReader<>(type);
try {
JsonDecoder decoder = DecoderFactory.get()
.jsonDecoder(ReflectData.get().getSchema(type), string);
return reader.read(null, decoder);
} catch (IOException ex) {
throw new RuntimeException("Deserialization error", ex);
}
}
@PostMapping
public Long test(@RequestBody String avroString) {
Long result = 0
Bank bank = fromJson(Bank.class, avroString);
result = bank.getId();
return result;
}
мой код avdl:
@namespace("my.avro.api.v1")
protocol Api {
record Bank {
long id;
string name;
string bin;
}
}
мои авроклассы автоматически генерируются с помощью avro-maven-plugin
моего сообщения:
{
"id": 256,
"name": "MyTestBank",
"bin": "047516949"
}
, но я всегда получаю эту странную ошибку:
class my.avro.api.v1.Bank cannot be cast to class my.avro.api.v1.Bank
(my.avro.api.v1.Bank is in unnamed module of loader 'app';
my.avro.api.v1.Bank is in unnamed module of loader
org.springframework.boot.devtools.restart.classloader.RestartClassLoader @712719ac)
Я понимаю, что можно записать конечную точку как public Long test(@RequestBody Bank bank)
, но я действительно не понимаю, почему я получаю эту ошибку при попытке десериализации строки. Может кто-нибудь помочь?
PS. Я понимаю, что этот случай может быть решен простым JSON, но в реальном сценарии мои авроклассы более сложные