«Ошибка отправки обработчика; вложенное исключение - NoClassDefFoundError: org / springframework / транзакция / support / TransactionSynchronizationManager», - PullRequest
0 голосов
/ 30 мая 2018

Я новичок в весенней загрузке.Попытка реализовать ehcache, но при этом появляется следующая ошибка:

Handler dispatch failed; nested exception is NoClassDefFoundError: org/springframework/transaction/support/TransactionSynchronizationManager

Ничего не регистрируется, только оператор Debug

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'

Cache Config

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" />

Я пытался положить @Кэшируемая аннотация на сервисном уровне вместо сервисного, но такая же.Любые указатели будут высоко оценены.Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Я думаю, что ваша проблема cacheManager.setTransactionAware(true);.Это заставит Spring связать кеш с транзакцией (с XA или поддельной версией, я не уверен в этом).Поэтому, если транзакция откатывается, изменения в кэше также будут.

Но вы в настоящее время не используете диспетчер транзакций Spring, поскольку он не находится в вашем пути к классам.Так что весна несчастна.Выполнение cacheManager.setTransactionAware(false); должно решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...