Spring mvc и memcache

Я использую memcached, чтобы действовать в соответствии с тем, что они сказали в адресе: https://code.google.com/p/simple-spring-memcached/wiki/Getting_Started. Кэш памяти на сервере, где это делается, я установил. Библиотека должна обязательно иметь ваш проект . Но при запуске вывод появляется.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name  'defaultCache' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]:   Instantiation of bean failed; nested exception is  org.springframework.beans.BeanInstantiationException: Could not instantiate bean class  [com.google.code.ssm.CacheFactory]: Constructor threw exception; nested exception is  java.lang.NoClassDefFoundError: org/codehaus/jackson/Versioned
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBea         n(AbstractAutowireCapableBeanFactory.java:965)


org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.google.code.ssm.CacheFactory]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/Versioned

я использую кеширование для такого метода

  @ReadThroughSingleCache(namespace = "CplxObj", expiration = 0)
public List<Answer> showAnswer(int id){

и в диспетчере-servlet.xml добавить это

  <cache:annotation-driven />

 <bean name="cacheManager" class="com.google.code.ssm.spring.SSMCacheManager">
 <property name="caches">
   <set>
     <bean class="com.google.code.ssm.spring.SSMCache">
       <constructor-arg name="cache" index="0" ref="defaultCache" />
       <!-- 5 minutes -->
       <constructor-arg name="expiration" index="1" value="300" />
      <!-- @CacheEvict(..., "allEntries" = true) won't work because allowClear is  false, 
        so we won't flush accidentally all entries from memcached instance -->
       <constructor-arg name="allowClear" index="2" value="false" />
     </bean>
   </set>
 </property>

  <bean name="defaultCache" class="com.google.code.ssm.CacheFactory">
   <property name="cacheName" value="defaultCache" />
  <property name="cacheClientFactory">
    <bean name="cacheClientFactory"  class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" />
  </property>
  <property name="addressProvider">
   <bean class="com.google.code.ssm.config.DefaultAddressProvider">
     <property name="address" value="199.26.84.24:11211" />
   </bean>
 </property>
 <property name="configuration">
   <bean class="com.google.code.ssm.providers.CacheConfiguration">
     <property name="consistentHashing" value="true" />
   </bean>
 </property>
 </bean>

Why is this a problem ?

************************* после изменения возникает эта ошибка ********************** **********

Error creating bean with name 'cacheManager' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Cannot create inner bean 'com.google.code.ssm.spring.SSMCache#b53b32' of type  [com.google.code.ssm.spring.SSMCache]  while setting bean property 'caches' with key [0];   
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.google.code.ssm.spring.SSMCache#b53b32' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Cannot resolve reference to bean 'defaultCache' while setting constructor argument; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultCache' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Cannot create inner bean 'cacheClientFactory' of type [com.google.code.ssm.providers.spymemcached.MemcacheClientFactoryImpl] while setting bean property 'cacheClientFactory'; 
nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.google.code.ssm.providers.spymemcached.MemcacheClientFactoryImpl] for bean with name 'cacheClientFactory' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]; 
nested exception is java.lang.ClassNotFoundException: com.google.code.ssm.providers.spymemcached.MemcacheClientFactoryImpl

Error creating bean with name 'com.google.code.ssm.spring.SSMCache#b53b32' defined  in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Cannot resolve reference to bean 'defaultCache' while setting constructor argument;

person Hadi J    schedule 27.10.2014    source источник


Ответы (2)


Я не использую com.google.code.ssm.CacheFactory, но ошибка говорит:

NoClassDefFoundError: org/codehaus/jackson/Versioned

В нем говорится, что есть зависимость от библиотеки Jackson json 1.x, а в пути к классам ее нет. Попробуйте добавить библиотеку Jackson 1.x и посмотрите, что получится...

person Serge Ballesta    schedule 27.10.2014

Какую версию Simple Spring Memcached (SSM) вы используете? Для последних версий требуется Jackson 2.x, поэтому просто обновите SSM до 3.5.0.

Если вы используете maven для управления своими зависимостями, необходимые артефакты будут загружены автоматически.

Кстати, чтобы кэшировать метод showAnswer, вы должны аннотировать один из параметров метода с помощью @ParameterValueKeyProvider:

@ReadThroughSingleCache(namespace = "answers", expiration = 0)
public List<Answer> showAnswer(@ParameterValueKeyProvider int id){

И убедитесь, что этот метод вызывается другим компонентом Spring, самостоятельные вызовы (через this) не работают (не перехватываются/кэшируются).

person ragnor    schedule 27.10.2014
comment
я изменил свой код и добавил SSM: 3.5.0. в lib.теперь возникает эта ошибка!! - person Hadi J; 28.10.2014
comment
Вы используете мавен? Похоже, вы не используете maven и не добавили все необходимые зависимости, потому что произошло ClassNotFoundException. Чтобы исправить это, добавьте spymemcached-provider и другие зависимости. - person ragnor; 28.10.2014
comment
нет, я не использую maven. но я добавляю все необходимые зависимости. - person Hadi J; 28.10.2014
comment
Все ошибки, которые уже произошли, в нем отображаться не будут. Но похоже, что данные не кэшируются. Знать или не кэшировать данные с помощью telnet Krdm.bh ваше мнение, в чем может быть причина? - person Hadi J; 28.10.2014
comment
Как вы вызываете showAnswer? Вы называете это с помощью объекта bean, например. myBean.showAnswer(..) или просто this.showAnswer(..) или showAnswer(...) ? - person ragnor; 29.10.2014
comment
Я вызываю таким образом: private ShowAnswerService showAnswerService; @Autowired public void setShowAnswerService(ShowAnswerService showAnswerService) { this.showAnswerService = showAnswerService; } showAnswerService.showAnswer(id); - person Hadi J; 29.10.2014
comment
Это правильный способ вызова метода. Как вы проверили, что метод не кэшируется? - person ragnor; 29.10.2014
comment
Я проверил телнетом. По команде получить ключ. Например, метод (showAnswer(id=50) я проверил. Получается 50. Но вывода нет. - person Hadi J; 29.10.2014
comment
Данные, относящиеся к идентификатору в базе данных, изменились и возвращаются к вызываемому идентификатору, но на выходе появляются предыдущие данные. Мы знаем, что шоу использует информацию из кеша браузера или нет? - person Hadi J; 29.10.2014
comment
Вызов get 50 в memcached для проверки кэширования значения неверен, потому что 50 — это не ключ, который используется для кэширования результата метода. Созданный ключ более сложен и состоит из пространства имен и некоторых разделителей. Простой способ проверить, вызывается ли метод только один раз или несколько раз, — добавить System.out.println(в методе showAnswer с аргументом + id) внутри метода showAnswer и проверить журналы. - person ragnor; 29.10.2014
comment
Если кеша нет, в чем может быть причина? - person Hadi J; 29.10.2014
comment
моя проблема не решена. пожалуйста, помогите мне. я не знаю. Я обрабатываю так, как вы говорите, и кеширование не выполняется. - person Hadi J; 29.10.2014
comment
Если используется кеш, идентификатор кеша не следует запускать повторно, а данные извлекаются из кеша. Но каждый раз, когда я хочу прочитать данные, которые были закэшированы, метод запускается снова. Правильно ли я рассуждаю? - person Hadi J; 29.10.2014
comment
Если используется кеш, идентификатор кеша не следует запускать повторно, а данные извлекаются из кеша. Но каждый раз, когда я хочу прочитать данные, которые были закэшированы, метод запускается снова. Правильно ли я рассуждаю? - person Hadi J; 29.10.2014
comment
Да это так. Если вы вызываете showAnswerService.showAnswer(17), а затем снова showAnswerService.showAnswer(17), то второй вызов должен не вызывать тело метода, а возвращать данные из кеша. Если вы используете другой идентификатор, кроме 17, например. 129, то метод будет вызван снова. Чтобы увидеть, как работает SSM, включите ведение журнала log4j, установив уровень INFO на com.google.code.ssm.aop. - person ragnor; 30.10.2014
comment
Я не знаю, правда. моя проблема еще не решена. пожалуйста, помогите мне! - person Hadi J; 03.11.2014