Почему вы считаете, что это возможная ошибка с Spring Data Geode's (SDG) o.s.d.g.mapping.MappingPdxSerializer
?
Довольно распространено и даже ожидается, что не все объекты, прошедшие через SDG MappingPdxSerializer
, будут иметь конструктор по умолчанию (т.е. public, no-arg).
При использовании таких типов в вашем приложении (например, как класс SD PageImpl
) и экземпляр этого типа считывается из Apache Geode (например, get(key)
), объект десериализуется и восстанавливается в (Region ) операция доступа к данным (при условии, что атрибут конфигурации read-serialized
Apache Geode не установлен на true ; что вызывает другие проблемы и не рекомендуется в этом случае), тогда вам необходимо зарегистрировать EntityInstantiator
, который сообщает SDG MappingPdxSerializer
, как создать экземпляр объекта, используя соответствующий конструктор.
«Соответствующий» конструктор определяется постоянным объектом PreferredConstructor
, который оценивается во время оценки типа инфраструктурой отображения SD и может быть задан с помощью @PersistenceContructor
аннотация, если необходимо. Это полезно в тех случаях, когда вы используете один из стандартных типов EntityIntantiator
SD, например ReflectionEntityInstantiator
, и тип вашего домена приложения имеет более 1 конструктора, отличного от используемого по умолчанию.
Таким образом, вы можете зарегистрировать 1 или более EntityInstantiator
объектов для каждого объекта домена приложения по типу, используя составной класс EntityIntantiatiors
, возможно с «отображением» между доменом приложения объект Class
типа (например, Page
) и EntityInstantiator
, а затем регистр EntityInstantiators
на SDG MappingPdxSerializer
.
Конечно, вам нужно убедиться, что настроенный MappingPdxSerializer
используется Apache Geode ...
@Configuration
class ApacheGeodeConfiration {
@Bean
MappingPdxSerializer pdxSerializer() {
Map<Class<?>, EntityInstantiator> customInstantiators = new HashMap<>();
customInstantiators.put(Page.class, new MyPageEntityInstantiator());
customInstantiators.put...
MappingPdxSerializer pdxSerializer =
MappingPdxSerializer.newMappingPdxSerializer();
pdxSerializer.setGemfireInstantiators(
new EntityInstantiators(customInstantiators));
return pdxSerializer;
}
@Bean
CacheFactoryBean gemfireCache(MappingPdxSerializer pdxSerializer) {
CacheFactoryBean gemfireCache = new CacheFactoryBean();
gemfireCache.setPdxSerializer(pdxSerializer);
gemfireCache.set...
return gemfireCache;
}
...
}
Надеюсь, это поможет!
-j