Мы используем ehcache для кэширования в нашем проекте.
import com.googlecode.ehcache.annotations.Cacheable;
// Other imports
@Component
public class Authenticator{
@Cacheable(cacheName = "rest_client_authorized")
public boolean isUserAuthorized(final String user, final String sessionId) {
// Method code
}
}
При входе в метод нет перехватчика кеша. То, что мы проверили до сих пор:
- Мы вызываем этот метод не внутри класса, а снаружи. Таким образом, проблема не во внутренних вызовах, которые заставляют обходить прокси.
- Мы добавили интерфейс для этого класса и изменили инъекции, в которых этот класс вызывается, чтобы использовать представление интерфейса вместо конкретного класса.
Мы определили диспетчер кеша в контексте нашего приложения следующим образом:
<ehcache:annotation-driven cache-manager="ehCacheManager" />
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<!-- use a share singleton CacheManager -->
<property name="shared" value="true" />
</bean>
Кэш определяется следующим образом:
<cache name="rest_client_authorized"
eternal="false"
maxElementsInMemory="50"
overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LRU" />
Когда мы тестируем диспетчер кеша с помощью Jconsole, мы видим, что кеш *rest_auth_disabled* существует и пуст.
Любые идеи относительно того, почему это не работает, будут высоко оценены. Спасибо!
Обновления (агрегация из комментариев ниже):
==========================================**
Это устаревший код, который отлично работал с классом и определениями, которые я предоставил. Метод, о котором я говорю здесь, является новым, но остальная часть класса работала в прошлом. Поэтому мы изо всех сил пытаемся понять, что изменилось. Мы также уже пытались заменить аннотацию на Spring Cacheable, но все равно ничего:/ Возможно, это зависит от кода, вызывающего этот новый метод, который относится к другому компоненту Spring, отличному от того, который мы использовали для других методов. Но я все еще не могу найти проблему.
Также попытался вернуть логическое значение вместо логического после ответа ниже, и это не сработало. У нас есть новая зацепка, которая, вероятно, связана с тем, как мы внедряем бин (используя @Autowire). Обновлю, если это действительно так.
equals()
иhashCode()
, а в примитивах отсутствуют оба метода. Рассмотрите возможность использования классов-оболочек и посмотрите, работает ли это. - person g00glen00b   schedule 12.04.2013