SpringData MongoDB - java .lang.InstantiationError при использовании TypeInformationMapper - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь применить преобразователь информации о настраиваемом типе для настройки значения поля «class_» в MongoDB. Код аналогичен решению, предложенному ниже в главе: Настройка значения поля _class в зависимости от типа объекта.

http://athlan.pl/spring-data-mongodb-remove-_class-define-explicitly/

Когда я его применяю (создайте класс, реализующий TypeInformationMapper с необходимые методы и карты m), я вижу в отладчике, что мои модели правильно связаны на карте (связана пакет -> моя пара имени class_). Затем сущности правильно добавляются в Mon go с назначенным правильным полем class_. Проблема начинается, когда я пытаюсь прочитать значение с помощью метода MongoRepository «findByXXX». Ошибка, которую я вижу:

java .lang.InstantiationError.

Мои объекты домена:

A - абстрактный класс B, C, D, E - обычные классы, расширяющие A

Я предполагаю, что после добавления настраиваемого картографа я стал неспособен читать данные из коллекции (точнее - получить объект B). Но почему?

B имеет ссылку на список объектов типа A (с использованием аннотации DBRef). Что интересно, когда я вручную удаляю эту ссылку во внешнем клиенте Mon go, я снова могу получить объект с помощью метода «findByXXX», если я снова создам объект C / D / E.

Моя конфигурация mongoTemplate следующая (немного изменена по сравнению с исходной версией из-за проблем с устареванием):

...

  private final Config config;

  @Bean
  public MongoClient mongoClient() {
    return MongoClients.create(config.getUrl());
  }

  @Bean
  public MongoTemplate mongoTemplate() {
    String[] basePackages = new String[] {"pl.test"};
    TypeInformationMapper typeMapper1 = new UserProfilesModelMongoInformationMapper.Builder().withBasePackages(basePackages).build();

    MongoTypeMapper typeMapper = new DefaultMongoTypeMapper(DefaultMongoTypeMapper.DEFAULT_TYPE_KEY, Arrays.asList(typeMapper1));
    SimpleMongoClientDbFactory mongoClientDbFactory = new SimpleMongoClientDbFactory(mongoClient(),config.getDbName());
    DefaultDbRefResolver defaultDbRefResolver = new DefaultDbRefResolver(mongoClientDbFactory);
    MappingMongoConverter converter = new MappingMongoConverter(defaultDbRefResolver, new MongoMappingContext());
    converter.setTypeMapper(typeMapper);

    return new MongoTemplate(mongoClientDbFactory, converter);
  }

Моя цель - сохранить работоспособность системы даже после возможного изменения пакетов классов сущностей в будущем.

...