JsonMappingException при сериализации сгенерированного объекта avro в json

2

Я использовал avro-tools для генерации java-классов из avsc файлов, используя:

java.exe -jar avro-tools-1.7.7.jar compile -string schema myfile.avsc 

Затем я попытался сериализовать такие объекты в json от ObjectMapper, но всегда получал исключение JsonMappingException, говорящее "не перечисление" или "не объединение". В моем тесте я создаю сгенерированный объект, используя его конструктор или конструктор. У меня есть такие исключения для объектов разных классов...

Образец кода:

ObjectMapper serializer = new ObjectMapper(); // com.fasterxml.jackson.databind
serializer.register(new JtsModule()); // com.bedatadriven.jackson.datatype.jts
...
return serializer.writeValueAsBytes(avroConvertedObject); // => JsonMappingException

Я также пробовал много конфигураций, используя: serializer.configure(...), но все еще не удалось. Версии: Java 1.8, jackson-datatype-jts 2.3, jackson-core 2.6.5, jackson-databind 2.6.5, джексон-аннотации 2.6.5

Какие-либо предложения? Благодарю!

  • 1
    Вы нашли какое-либо решение этой проблемы? Я также сталкиваюсь с той же проблемой.
  • 0
    Я тоже испытываю эту проблему.
Показать ещё 2 комментария
Теги:
serialization
avro

1 ответ

1

Если член SCHEMA действительно имеет место (мы не видим полного сообщения об ошибке), вы можете его отключить. Я использую mixin для этого, например:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.avro.Schema;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

public class AvroGenerTests
{
  abstract class IgnoreSchemaProperty
  {
    // You have to use the correct package for JsonIgnore,
    // fasterxml or codehaus
    @JsonIgnore abstract void getSchema();
  }

  @Test
  public void writeJson() throws IOException {
    BookAvro b = BookAvro.newBuilder()
      .setTitle("Wilk stepowy")
      .setAuthor("Herman Hesse")
      .build();
    ObjectMapper om = new ObjectMapper();
    om.enable(SerializationFeature.INDENT_OUTPUT);
    om.addMixIn(BookAvro.class, IgnoreSchemaProperty.class);
    om.writeValue(new File("plik_z_gen.json"), b);
  }
}
  • 0
    Это сработало для меня. Спасибо за решение. Для тех, кто хочет игнорировать один и тот же метод в иерархии классов, у меня работает следующее. om.addMixIn (Object.class, IgnoreSchemaProperty.class)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню