Sono di fronte a problemi durante l'acquisizione di valore dalla cache.spring-boot-devtools che causa ClassCastException durante il recupero dalla cache.
java.lang.RuntimeException: java.lang.ClassCastException: com.mycom.admin.domain.User cannot be cast to com.mycom.admin.domain.User
di configurazione della cache
@Configuration
@EnableCaching
@AutoConfigureAfter(value = { MetricsConfiguration.class, DatabaseConfiguration.class })
@Profile("!" + Constants.SPRING_PROFILE_FAST)
public class MemcachedCacheConfiguration extends CachingConfigurerSupport {
private final Logger log = LoggerFactory.getLogger(MemcachedCacheConfiguration.class);
@Override
@Bean
public CacheManager cacheManager() {
ExtendedSSMCacheManager cacheManager = new ExtendedSSMCacheManager();
try {
List<SSMCache> list = new ArrayList<>();
list.add(new SSMCache(defaultCache("apiCache"), 86400, false));
cacheManager.setCaches(list);
} catch (Exception e) {
e.printStackTrace();
}
return cacheManager;
}
@Override
public CacheResolver cacheResolver() {
return null;
}
@Override
public CacheErrorHandler errorHandler() {
return null;
}
private Cache defaultCache(String cacheName) throws Exception {
CacheFactory cacheFactory = new CacheFactory();
cacheFactory.setCacheName(cacheName);
cacheFactory.setCacheClientFactory(new MemcacheClientFactoryImpl());
String serverHost = "127.0.0.1:11211";
cacheFactory.setAddressProvider(new DefaultAddressProvider(serverHost));
cacheFactory.setConfiguration(cacheConfiguration());
return cacheFactory.getObject();
}
@Bean
public CacheConfiguration cacheConfiguration() {
CacheConfiguration cacheConfiguration = new CacheConfiguration();
cacheConfiguration.setConsistentHashing(true);
return cacheConfiguration;
}
}
e annotato con
@Cacheable(value = "apiCache#86400", key = "'User-'.concat(#login)")
Sto usando com.google.code.simple-primavera-memcached 3.5.0
valore è sempre memorizzato nella cache ma durante l'applicazione genera un errore di cast di classe. Quali sarebbero i possibili problemi.
Avete lo stesso 'class' sul classpath due volte? Oppure lo hai caricato da più classloader (o da un esempio in un ambiente WebApp). La solita causa per cui una classe non può essere lanciata su se stessa è che le classi sono caricate da luoghi diversi ... –
Ad una ipotesi, sembra un qualche tipo di problema ClassLoader. Sembra che tu abbia due diversi classloader che hanno caricato la stessa classe. – sisyphus
@sisyphus utilizzo spring boot + devtools. Ho letto alcuni in cui devtools mantiene un programma di caricamento classi per i barattoli statici e uno per il codice dell'applicazione. Questo potrebbe causare problemi? – titogeo