2013-04-10 2 views
3

Мы используем 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 
    } 
} 

При входе в метод отсутствует перехватчик кеша. То, что мы проверили до сих пор:

  1. Мы не называем этот метод внутри класса, а снаружи. Таким образом, проблема заключается не в внутренних вызовах, которые приводят к обходу прокси-сервера.
  2. Мы добавили интерфейс для этого класса, и мы изменили инъекции, в которых этот класс вызывается, чтобы использовать представление интерфейса вместо конкретного класса.

Мы определили менеджер кэша в нашем контексте приложения таким образом:

<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 * существует и пуст.

Любые идеи относительно того, почему это не сработает, будут оценены по достоинству. Благодаря!

Updates (агрегатные от комментариев ниже):

================================ ========== **

Это устаревший код, который отлично работал с классом и определениями, которые я предоставил. Метод, о котором я говорю здесь, нова, но остальная часть класса работала в прошлом. Поэтому мы пытаемся понять, что изменилось. Мы также попытались заменить аннотацию на весну Cacheable, но все равно ничего:/ Возможно, это зависит от кода, который вызывает этот новый метод, который отличается от другого весеннего компонента, чем то, что мы использовали для других методов. Но я все еще не могу найти проблему.

Также попытался вернуть Boolean вместо boolean после ответа ниже, и это не сработало. У нас есть новое руководство, которое, вероятно, связано с тем, как мы вводим компонент (используя @Autowire). Будет обновляться, если это действительно так.

+1

Что живучесть провайдер вы используете? При использовании спящего режима см. [HH-5303] (https://hibernate.atlassian.net/browse/HHH-5303) –

+0

Хорошо, мы используем Hibernate. Но мы уже использовали @Cacheable в этом проекте, и он сработал. Кэш кэшируется в памяти, а не в БД. Также обратите внимание, что это не аннотация JPA, поэтому я не уверен, что это так. Как вы думаете? – Avi

+0

Вы правы, я не прочитал фактическое заявление импорта и предположил, что это была аннотация JPA, о которой вы говорили. Какой сервер приложений вы используете? –

ответ

3

Эта проблема может иметь отношение к заказу Springs загружает бобы. Попробуйте удалить аннотацию @Autowire из объявления Authenticator и выполнить автоуправление вручную. Что-то вроде:

/** 
* Class that uses Authenticator 
*/ 

public class X { 

    // Don't use @autowire here 
    public Authenticator athenticator; 

    public void doSomething() { 
     manuallyAutowire(); 
    } 

    public void manuallyAutowire() { 
     if(authenticator == null) { 
    authenticator = ApplicationContextUtils.getApplicationContext(). 
          getBean(authenticator.class); 
    } 
} 

Где

@Component 
public class ApplicationContextUtils implements ApplicationContextAware { 

    private static ApplicationContext ctx; 

    @Override 
    public void setApplicationContext(final ApplicationContext appContext) 
              throws BeansException { 
     ctx = appContext; 

    } 

    public static ApplicationContext getApplicationContext() { 
     return ctx; 
    } 
} 
1

Значение параметра cacheName в @Cacheable должен быть одинаковым с величиной имени атрибута < кэша > декларацией в вашем прикладном контексте

+0

Вы правы, и это то же самое. Я просто скопировал другую запись xml по ошибке. Я починил это. Спасибо за Ваш ответ! – Avi

1

Я думаю, что вы путаете вещи здесь - вы использовали com.googlecode.ehcache.annotations.Cacheable, если вы хотите, чтобы поддержка кеширования Springs на самом деле была org.springframework.cache.annotation.Cacheable. Тогда кеширующие перехватчики должны работать чисто.

+0

Проблема в том, что это устаревший код сработал с кодом и определениями, которые я предоставил. Метод, о котором я говорю здесь, нова, но остальная часть класса работала в прошлом. Поэтому мы пытаемся понять, что изменилось. Мы также попытались заменить аннотацию на весну Cacheable, но все равно ничего:/ – Avi

+0

О, ладно, я не знаком с поддержкой аннотаций к ehcache Spring, но если вы используете Spring's @Cacheable (org.spring ..), то вам также придется изменить '' to '', кеш-префикс в пространстве имен 'http: // www.springframework.org/schema/cache', это должно создайте для вас прокси. –

1

Насколько я знаю, аннотации Spring Ehcache рекомендуют, чтобы оба параметра как объект возврата должны иметь метод equals() и hashCode(), которые отсутствуют в примитивных типах.

Я не уверен, что этот каркас преобразует примитивы в их вариант обертки (например, Integer или Boolean).Попробуйте вернуть вариант оболочки Boolean вместо примитивного типа и посмотреть, работает ли он.

Другое дело, что я не уверен в том, как (и если) он обрабатывает параметры final. Если моя первая идея не работает, попробуйте удалить ключевое слово final, если это возможно, и посмотрите, работает ли она.

+0

Хорошо, это отличные входы! Я проверю его и сообщите о результатах. Благодаря! – Avi

Смежные вопросы