Как использовать аннотации @CachePut и @CacheEvict с ehCache (ehCache 2.4.4, Spring 3.1.1) - PullRequest
11 голосов
/ 29 февраля 2012

Я попробовал некоторые новые функции Spring и обнаружил, что аннотации @CachePut и @CacheEvict не действуют.Может быть, я делаю что-то не так.Не могли бы вы мне помочь?

My applicationContext.xml.

<cache:annotation-driven />

<!--also tried this-->
<!--<ehcache:annotation-driven />-->

<bean id="cacheManager" 
        class="org.springframework.cache.ehcache.EhCacheCacheManager"
        p:cache-manager-ref="ehcache"/>
<bean id="ehcache"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
        p:config-location="classpath:ehcache.xml"/>

Эта часть работает хорошо.

@Cacheable(value = "finders")
public Finder getFinder(String code)
{
    return getFinderFromDB(code);
}

@CacheEvict(value = "finders", allEntries = true)
public void clearCache()
{
}

Но если я хочу удалить одно значение из кэша или переопределитьэто я не могу этого сделать.Что я тестировал:

@CacheEvict(value = "finders", key = "#finder.code")
public boolean updateFinder(Finder finder, boolean nullValuesAllowed)
{
    // ...
}

/////////////

@CacheEvict(value = "finders")
public void clearCache(String code)
{
}

/////////////

@CachePut(value = "finders", key = "#finder.code")
public Finder updateFinder(Finder finder, boolean nullValuesAllowed)
{
    // gets newFinder that is different
    return newFinder;
}

1 Ответ

16 голосов
/ 01 марта 2012

Я нашел причину, почему это не сработало. Я вызвал эти методы из другого метода в том же классе. Так что эти вызовы не проходили через объект Proxy, поэтому аннотации не работали.

Правильный пример:

@Service
@Transactional
public class MyClass {

    @CachePut(value = "finders", key = "#finder.code")
    public Finder updateFinder(Finder finder, boolean nullValuesAllowed)
    {
        // gets newFinder
        return newFinder;
    }
}

и

@Component
public class SomeOtherClass {

    @Autowired
    private MyClass myClass;

    public void updateFinderTest() {
        Finder finderWithNewName = new Finder();
        finderWithNewName.setCode("abc");
        finderWithNewName.setName("123");
        myClass.updateFinder(finderWithNewName, false);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...