내 앱은 봄 부팅 + hazelcast를 기반으로합니다. 내가 hazelcast로 간단한 개체를 저장하려고Hazelcast, HazelcastSerializationException 데이터를 매핑 할 때
:
public class ExampleMeeting implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
public ExampleMeeting(String id, String name) {
this.id = id;
this.name = name;
}
public ExampleMeeting() {
}
// getters and setters
}
내 서비스 방법은 다음과 같이 :
@CachePut(value = MEETING_CACHE_NAME, key = "#meeting.id")
public ExampleMeeting saveMeeting(ExampleMeeting meeting) {
LOGGER.info("Save meeting to cache {}", meeting);
return meeting;
}
내가 추적과 com.hazelcast.nio.serialization.HazelcastSerializationException
을받은 엔티티에 저장하는 것을 시도하고있다 :
com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable de-serializer for type 2. This exception is likely to be caused by differences in the serialization configuration between members or between clients and members.
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.newHazelcastSerializationException(AbstractSerializationService.java:173)
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:200)
at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:600)
at com.hazelcast.cluster.impl.ConfigCheck.readData(ConfigCheck.java:215)
at com.hazelcast.cluster.impl.JoinMessage.readData(JoinMessage.java:98)
at com.hazelcast.cluster.impl.JoinRequest.readData(JoinRequest.java:68)
at com.hazelcast.internal.serialization.impl.DataSerializer.read(DataSerializer.java:121)
at com.hazelcast.internal.serialization.impl.DataSerializer.read(DataSerializer.java:47)
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:46)
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:204)
at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:600)
at com.hazelcast.cluster.impl.MulticastService.receive(MulticastService.java:201)
at com.hazelcast.cluster.impl.MulticastService.run(MulticastService.java:159)
at java.lang.Thread.run(Thread.java:745)
여기 내 헤즐리티 캐스트 설정입니다 :
@Bean
HazelcastInstance hazelcastInstance() {
Config config = new ClasspathXmlConfig(hazelcatsConfig);
Map<String, MapConfig> mapConfigMap = new HashMap<String, MapConfig>();
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(applicationContext);
for (BeanDefinition bd : scanner.findCandidateComponents("com.egalacoral.spark")) {
String className = bd.getBeanClassName();
try {
Class<?> classObj = Class.forName(className);
Method[] methods = classObj.getDeclaredMethods();
for (Method method2 : methods) {
Cacheable annotation = AnnotationUtils.getAnnotation(method2, Cacheable.class);
if (annotation != null && annotation.value().length > 0) {
addMap(mapConfigMap, method2, annotation);
}
}
} catch (ClassNotFoundException e) {
LOGGER.error("Error while creating maps for caches", e);
}
}
config.setMapConfigs(mapConfigMap);
return Hazelcast.newHazelcastInstance(config);
}
이 문제를 어떻게 해결할 수 있는지 알려주십시오.
UPADATED는 :
protected void addMap(Map<String, MapConfig> mapConfigMap, Method method2, Cacheable annotation) {
MapConfig mapConfig = new MapConfig();
HazelcastMapConfig cacheConfig = AnnotationUtils.getAnnotation(method2, HazelcastMapConfig.class);
mapConfig.setEvictionPolicy(cacheConfig.evictionPolicy());
String timeToLiveSeconds = cacheConfig.timeToLiveSeconds();
if (StringUtils.hasText(timeToLiveSeconds)) {
timeToLiveSeconds = this.embeddedValueResolver.resolvePlaceholders(timeToLiveSeconds);
}
mapConfig.setTimeToLiveSeconds(Integer.parseInt(timeToLiveSeconds));
String key = annotation.value()[0];
mapConfigMap.put(key, mapConfig);
LOGGER.info("Created map for cache {} : {} ", key, mapConfig);
}
감사합니다? '.addSerializerConfig (new SerializerConfig(). setImplementation (serializer) .setTypeClass (ExampleMeeting.class)))')와 같은 것? – noscreenname
@noscreenname 응답 해 주셔서 감사합니다. 아니. 항상 hazelcast에 대한 사용자 지정 serializer를 추가해야합니까? –
@I.Domshchikon 아니요, stacktrace가 잘못된 직렬화 conf로 인해 발생할 수 있다고 제안했습니다. 'addMap (mapConfigMap, method2, annotation)'의 코드를 추가 할 수 있습니까? – noscreenname