I am trying to migrate from Spring Boot 2.7 application with Hazelcast 4.2 to Spring Boot 3.2 and Hazelcast 5.3, which also includes JCache Hazelcast provider.
In previous version I was using WebFilter from Hazelcast (https://github.com/hazelcast/hazelcast-wm/blob/master/src/main/java/com/hazelcast/web/WebFilter.java) registered with FilterRegistrationBean, but it is not prepared for Spring Boot 3 bacause of the lack of jakarta imports.
Because of that I wanted to use Spring Session Hazelcast configuration, but after making request to application I am getting this stacktrace:
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: org.springframework.session.hazelcast.SessionUpdateEntryProcessor
at com.hazelcast.internal.serialization.impl.defaultserializers.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:96)
at com.hazelcast.internal.serialization.impl.defaultserializers.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:85)
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:44)
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:271)
at com.hazelcast.client.impl.protocol.task.map.MapExecuteOnKeyMessageTask.prepareOperation(MapExecuteOnKeyMessageTask.java:42)
at com.hazelcast.client.impl.protocol.task.AbstractPartitionMessageTask.processInternal(AbstractPartitionMessageTask.java:45)
at com.hazelcast.client.impl.protocol.task.AbstractAsyncMessageTask.processMessage(AbstractAsyncMessageTask.java:71)
at (...) com.hazelcast.internal.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:111)
at ------ submitted from ------.()
at com.hazelcast.internal.util.ExceptionUtil.cloneExceptionWithFixedAsyncStackTrace(ExceptionUtil.java:348)
at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.returnOrThrowWithGetConventions(InvocationFuture.java:112)
(...)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.ClassNotFoundException: org.springframework.session.hazelcast.SessionUpdateEntryProcessor
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
(...)
com.hazelcast.internal.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:999)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2003)
(...)
com.hazelcast.internal.serialization.impl.defaultserializers.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:92)
at com.hazelcast.internal.serialization.impl.defaultserializers.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:85)
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:44)
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:271)
(...)
at com.hazelcast.internal.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:111)
I get this error after following this documentantion, but I’m not sure if I adjusted this in a right way (using JCache etc.): https://docs.spring.io/spring-session/reference/3.2/http-session.html#httpsession-hazelcast
There is also some information on Hazelcast but it lacks changes for new versions: https://docs.hazelcast.com/tutorials/spring-session-hazelcast
My configuration and code (using Spring Boot 3.2.6, Hazelcast 5.3.7 client, hazelcast 5.3.7 default server running in docker-compose):
docker-compose.yml
version: "3"
services:
hazelcast:
image: hazelcast/hazelcast:5.3.7-slim
ports:
- "5701:5701"
pom.xml
org.springframework.boot:spring-boot-starter-web-3.2.6
org.springframework.boot:spring-boot-starter-cache-3.2.6
org.springframework.session:spring-session-core-3.2.3
org.springframework.session:spring-session-hazelcast-3.2.3
javax.cache:cache-api-1.1.1
com.hazelcast:hazelcast-spring-5.3.7
com.hazelcast:hazelcast-5.3.7
application.yml
spring:
cache:
type: jcache
jcache:
provider: com.hazelcast.client.cache.HazelcastClientCachingProvider
hazelcast:
config: classpath:hazelcast-client.xml
hazelcast-client.xml
<hazelcast-client xmlns="http://www.hazelcast.com/schema/client-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/client-config
http://www.hazelcast.com/schema/client-config/hazelcast-client-config-5.3.xsd">
<cluster-name>dev</cluster-name>
<instance-name>hazelcast-client</instance-name>
<network>
<cluster-members>
<address>localhost:5701</address>
</cluster-members>
</network>
</hazelcast-client>
HazelcastSessionConfiguration.kt
@EnableHazelcastHttpSession
@Configuration
open class HazelcastSessionConfiguration {
@Bean
open fun hazelcastConfig(): Config {
val config = Config()
val attributeConfig = AttributeConfig()
.setName(HazelcastIndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE)
.setExtractorClassName(PrincipalNameExtractor::class.java.name)
config.getMapConfig(HazelcastIndexedSessionRepository.DEFAULT_SESSION_MAP_NAME)
.addAttributeConfig(attributeConfig)
.addIndexConfig(
IndexConfig(IndexType.HASH, HazelcastIndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE)
)
config.setClusterName("dev")
config.networkConfig.setPublicAddress("localhost:5701")
val serializerConfig = SerializerConfig()
serializerConfig.setImplementation(HazelcastSessionSerializer()).setTypeClass(MapSession::class.java)
config.serializationConfig.addSerializerConfig(serializerConfig)
return config
}
}
I tried different configurations, with and without “hazelcastConfig” bean, changing hazelcast to 5.4 and 4.2, or creating “hazelcastIntance” bean but then I get other error:
Caused by: javax.cache.CacheException: Error opening URI [hazelcast]
at com.hazelcast.cache.impl.AbstractHazelcastCachingProvider.getCacheManager(AbstractHazelcastCachingProvider.java:132)
at com.hazelcast.client.cache.HazelcastClientCachingProvider.getCacheManager(HazelcastClientCachingProvider.java:63)
(...)
Caused by: java.lang.ClassCastException: class com.hazelcast.instance.impl.HazelcastInstanceProxy cannot be cast to class com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl (com.hazelcast.instance.impl.HazelcastInstanceProxy and com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl are in unnamed module of loader 'app')
at com.hazelcast.client.cache.impl.HazelcastClientCacheManager.<init>(HazelcastClientCacheManager.java:69)
What am I missing here? Any help will be appreciated