Проблема десериализации объектов из кеша на MyBatis 3 / Java - PullRequest
2 голосов
/ 04 февраля 2011

Итак, я работаю над сторонним проектом, использующим MySQL / MyBatis3 / Tomcat. В настоящее время я работаю над включением кэширования в MyBatis. Когда я впервые попытался включить кэширование, я получил исключения из-за того, что мой объект не реализовал Serializable. Итак, после реализации Serializable с объектом, который я пытался кэшировать; оказалось, что кешируется нормально.

Но; когда я второй раз ударил свой сервлет в той же ситуации, и средство отображения объектов пытается десериализовать мой объект из кэша, я получаю следующую трассировку стека:

### Error querying database.  Cause: org.apache.ibatis.cache.CacheException: Error deserializing object.  Cause: java.lang.ClassNotFoundException: my.package.MyClass
### Cause: org.apache.ibatis.cache.CacheException: Error deserializing object.  Cause: java.lang.ClassNotFoundException: my.package.MyClass
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:77)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:69)
at org.apache.ibatis.binding.MapperMethod.executeForList(MapperMethod.java:85)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:65)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:38)
at $Proxy5.selectAllArgs(Unknown Source)

Другая вещь, которую я не понимаю, это:

Serializable result;
try {
  ByteArrayInputStream bis = new ByteArrayInputStream((byte[]) value);
  ObjectInputStream ois = new ObjectInputStream(bis);

  // LINE THROWING EXCEPTION IN org.apache.ibatis.cache.decorators.SerializedCache
  result = (Serializable) ois.readObject();
  // -- -----------------------------------

  ois.close();
} catch (Exception e) {
  throw new CacheException("Error deserializing object.  Cause: " + e, e);
}
return result;

Почему он даже пытается загрузить класс для начала? Это просто нужно привести к Serializable. Стоит отметить, что когда у меня не включено кэширование; все работает как положено.

1 Ответ

0 голосов
/ 06 февраля 2011

По сути, причина этого состояла в том, что мой проект в Eclipse был настроен неправильно, и в результате некоторые классы были недоступны при запуске моего сервера. По сути, все, что я сделал, это изменил каталог вывода сборки с «workspace / project / build» на «workspace / project / WebContent / WEB-INF / build». Я собираюсь прочитать больше о правильном развертывании сервлета сейчас ...

...