问题
I want to use Hazelcast as 2nd Level Cache Provider. When I start my application local as Spring it works fine. But when I create an EAR to deploy and run on Payara (Glassfish), I get the error
Caused by: java.lang.IllegalArgumentException: Type id must be positive! Current: -203, Serializer: com.hazelcast.hibernate.serialization.Hibernate42CacheEntrySerializer@7f08093f at com.hazelcast.nio.serialization.SerializationServiceImpl.register(SerializationServiceImpl.java:416) at com.hazelcast.nio.serialization.DefaultSerializationServiceBuilder.registerSerializerHooks(DefaultSerializationServiceBuilder.java:245) at com.hazelcast.nio.serialization.DefaultSerializationServiceBuilder.build(DefaultSerializationServiceBuilder.java:196) at com.hazelcast.instance.DefaultNodeExtension.createSerializationService(DefaultNodeExtension.java:113) at com.hazelcast.instance.Node.(Node.java:160) at com.hazelcast.instance.HazelcastInstanceImpl.(HazelcastInstanceImpl.java:120) at com.hazelcast.instance.HazelcastInstanceFactory.constructHazelcastInstance(HazelcastInstanceFactory.java:152) at com.hazelcast.instance.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:135) at com.hazelcast.instance.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:111) at com.hazelcast.core.Hazelcast.newHazelcastInstance(Hazelcast.java:58) at com.hazelcast.hibernate.instance.HazelcastInstanceLoader.createOrGetInstance(HazelcastInstanceLoader.java:91) at com.hazelcast.hibernate.instance.HazelcastInstanceLoader.loadInstance(HazelcastInstanceLoader.java:81) at com.hazelcast.hibernate.AbstractHazelcastCacheRegionFactory.start(AbstractHazelcastCacheRegionFactory.java:88) at org.hibernate.internal.CacheImpl.(CacheImpl.java:70) at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:40) at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:35) at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:91) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:251)
I added the following dependencies
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate4</artifactId>
<version>3.5</version>
</dependency>
And these properties I added to my configuration
<prop key="hibernate.cache.region.factory_class">com.hazelcast.hibernate.HazelcastLocalCacheRegionFactory</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">classpath:hazelcastServer.xml</prop>
<prop key="hibernate.cache.hazelcast.use_native_client">false</prop>
Does anyone know what the problem is and how to solve? I think it can depend on the payara server which has an integrated Hazelcast instance. The intern function is disabled.
回答1:
This is a bit old topic, but if anyone runs into this...
It appears hazelcast uses negative IDs for internal serializers and positive ones for external. The isInternal registration check however does:
return type.getClassLoader() == classLoader && name.startsWith(HAZELCAST_BASE_PACKAGE);
So this exception will happen if the hazelcast-hibernate4 is loaded in different classloader than the hazelcast core (I can reproduce this if I put hazelcast jar in tomcat/lib and package hazelcast-hibernate4 within my application war).
来源:https://stackoverflow.com/questions/32637634/hazelcast-hibernate-spring-in-payara-glassfish-environment-type-id-must-be