Я новичок в весенних ботинках. Пытаюсь реализовать ehcache, но получаю следующую ошибку:
Handler dispatch failed; nested exception is NoClassDefFoundError: org/springframework/transaction/support/TransactionSynchronizationManager
Ничего не регистрируется, только инструкция отладки
2018-05-30 14:09:47.291 DEBUG 5520 --- [nio-9091-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public org.springframework.http.ResponseEntity<?> com.jetblue.api.controller.AirportLocationController.getAirport(com.jetblue.api.domain.Location,org.springframework.validation.BindingResult)]: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/transaction/support/TransactionSynchronizationManager
2018-05-30 14:09:47.293 DEBUG 5520 --- [nio-9091-exec-2] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'customizedResponseEntityExceptionHandler'
Конфигурация кеша
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
@EnableCaching
public class CacheConfiguration {
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactory() {
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
cacheManagerFactoryBean.setShared(true);
return cacheManagerFactoryBean;
}
@Bean
public EhCacheCacheManager ehCacheCacheManager() {
EhCacheCacheManager cacheManager = new EhCacheCacheManager();
cacheManager.setCacheManager(ehCacheManagerFactory().getObject());
cacheManager.setTransactionAware(true);
return cacheManager;
}
}
Уровень обслуживания:
@Override
public NearByAirport getAirport(Location location) {
............
}
Интерфейс:
public interface IAirportLocatorService {
/**
* Gets the airport.
*
* @param airport the airport
* @return the airport
*/
@Cacheable(value = "nearestAirport", key = "#location.latAndLong")
public NearByAirport getAirport(Location location);
}
ehcache.xml
<cache name = "nearestAirport" eternal = "false"
maxElementsInMemory = "250" overflowToDisk = "false" diskPersistent = "false"
timeToIdleSeconds = "21600" timeToLiveSeconds = "21600"
memoryStoreEvictionPolicy = "LRU" />
Я попытался разместить аннотацию @Cachable на уровне сервиса вместо сервиса, но тот же результат. Будем очень признательны за любые указатели. Спасибо.




Думаю твоя проблема - cacheManager.setTransactionAware(true);. Это заставит Spring связать кеш с транзакцией (с XA или его поддельной версией, я не уверен в этом). Так что, если транзакция откатывается, изменения в кеше тоже будут.
Но в настоящее время вы не используете диспетчер транзакций Spring, поскольку его нет в вашем пути к классам. Итак, Spring недовольна. Выполнение cacheManager.setTransactionAware(false); должно решить проблему.
Уважаемый Анри, Спасибо за ваше время, но похоже, что я уже сделал то, что вы предложили в моем классе конфигурации :(. Что-нибудь еще вы можете выяснить?
Arg ... Я имел ввиду setTransactionAware (false)
Зависимости: 1) org.springframework.boot: spring-boot-starter-web 2) org.springframework.boot: spring-boot-starter-cache 3) net.sf.ehcache: ehcache: 2.10.4