Я пытаюсь применить преобразователь информации о настраиваемом типе для настройки значения поля «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);
}
Моя цель - сохранить работоспособность системы даже после возможного изменения пакетов классов сущностей в будущем.