Различные загрузчики классов вызывают ClassCastException при сохранении данных через Spring - PullRequest
4 голосов
/ 25 октября 2010

Я создаю веб-приложение MVC Spring.Использование: Jetty (контейнер сервлета), DataNucleus (платформа dao), DB4O (встроенное хранилище данных).

Когда я сохраняю объект (выполненный из Spring Controller), используя JDO из DataNucleus, он сохраняется в штрафной базе данных.

@PersistenceCapable
public class Test {
    @Persistent
    private String testString;
    //getter-setters implemented
}

Когда я делаю простой запрос для объектов, которые я ранее добавил, я получаю ClassCastException в своем классе Test (не могу привести a.b.c.Test к a.b.c.Test).

Загрузчик классов Test, возвращаемый JDO, равен (toString) [sun.misc.Launcher$AppClassLoader@5acac268], загрузчик классов класса Test до того, как я сохранил его в БД: [WebAppClassLoader@1593275665]

Я получил это далеко, но я неЯ действительно не знаю, что делать с такой проблемой загрузчика классов, я никогда раньше не задумывался о загрузчиках классов.Любое направление полезно.

Ответы [ 2 ]

4 голосов
/ 25 октября 2010

Не должно быть двух разных версий класса, чтобы появилось исключение приведения класса. Даже одно и то же определение класса воспринимается как два разных класса при загрузке двумя разными загрузчиками классов. Что, похоже, имеет место здесь.

К сожалению, я не знаком с платформами, которые вы используете, поэтомуЯ не могу дать более конкретный совет, чем этот: попробуйте поэкспериментировать с перемещением фляги, содержащей ваш класс Test, в другие места на пути к классам вашего веб-приложения и / или перенастроить загрузчики классов Spring и Jetty, чтобы оба делегировали загрузку Test к тому же родительскому загрузчику классов.

2 голосов
/ 25 октября 2010

Я думаю, что ваша проблема может быть аналогична описанной здесь .

Если это так, то может показаться, что лекарство от jdo-файла загружено общим предком загрузчиков классов.

...