Почему я получаю ClassNotPersistableException при запуске приложения GWT App Engine в размещенном режиме? - PullRequest
13 голосов
/ 17 июня 2009

Я случайно получаю исключение org.datanucleus.exceptions.ClassNotPersistableException при попытке выполнить запрос к локальному хранилищу данных JDO моего приложения GWT / App Engine. Это происходит только тогда, когда я запускаю приложение в режиме хостинга. Когда я внедряю его в Google App Engine, все работает отлично.

Трассировка стека:

org.datanucleus.exceptions.ClassNotPersistableException: The class "com.wayd.server.beans.WinePost" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.
    at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:305)
    at org.datanucleus.ObjectManagerImpl.getExtent(ObjectManagerImpl.java:3700)
    at org.datanucleus.jdo.JDOPersistenceManager.getExtent(JDOPersistenceManager.java:1515)
    at com.wayd.server.WinePostServiceImpl.getPosts(WinePostServiceImpl.java:212)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
    ... 25 more
Caused by: org.datanucleus.exceptions.ClassNotPersistableException: The class "com.wayd.server.beans.WinePost" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.
    at org.datanucleus.ObjectManagerImpl.assertClassPersistable(ObjectManagerImpl.java:3830)
    at org.datanucleus.ObjectManagerImpl.getExtent(ObjectManagerImpl.java:3693)
    ... 32 more)

Класс WinePost - это очень простой класс JDO, поддерживающий постоянство:

@ PersistenceCapable (identityType = IdentityType.APPLICATION) открытый класс WinePost {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

@Persistent
private User author;

@Persistent
private String grape;

@Persistent
private String comment;

public WinePost(final User author, final String grape,
        final String comment) {
    super();
    this.grape = grape;
    this.comment = comment;
}

public User getAuthor() {
    return author;
}

public void setAuthor(final User author) {
    this.author = author;
}

public Long getId() {
    return id;
}

public void setId(final Long id) {
    this.id = id;
}

public String getGrape() {
    return grape;
}

public void setGrape(final String grape) {
    this.grape = grape;
}

public String getComment() {
    return comment;
}

public void setComment(final String comment) {
    this.comment = comment;
}

public String getUserNickname() {
    String retVal = null;
    if (author != null) {
        retVal = author.getNickname();
    }
    return retVal;
}

public WinePostModel getWinePostModel() {
    final WinePostModel winePostModel = new WinePostModel(grape, vintage, getUserNickName());
    return winePostModel;
}

}

Запрос хранилища данных выполняется следующим способом:

public ArrayList<WinePostModel> getPosts() {
        final ArrayList<WinePostModel> posts = new ArrayList<WinePostModel>();
        final PersistenceManager persistenceManager = PMF.get()
        .getPersistenceManager();

        final Extent<WinePost> winePostExtent = persistenceManager.getExtent(
                WinePost.class, false);
        for (final WinePost winePost : winePostExtent) {
            posts.add(winePost.getWinePostModel());
        }
        winePostExtent.closeAll();

        return posts;
    }

Ответы [ 7 ]

15 голосов
/ 17 сентября 2009

Я почти уверен, что с вашим кодом все в порядке. Причиной возникновения этой ошибки является проблема с усилителем Datanucleus.

Если вы видите эту ошибку, выйдите из Jetty и проверьте консоль внутри Eclipse (вам нужно выбрать правильную консоль на маленькой панели инструментов над окном консоли). Стоит сказать что-то вроде:

DataNucleus Enhancer (версия 1.1.4): Улучшение классов DataNucleus Enhancer успешно завершен для X классов. Время: вход = 547 мс, усиление = 76 мс, всего = 623 мс. Обратитесь к журналу для получения полной информации

... где X - количество обработанных классов. Число должно быть равно количеству «сущности», которое вы определили.

Но иногда по какой-то причине он говорит 0, поэтому вы получаете ошибку ClassNotPersistableException.

Чтобы исправить, откройте класс сущности, что-то измените (добавьте пробел или что-то) и сохраните. Проверяйте консоль, пока она не скажет, что она улучшила все ваши классы сущностей. Затем перезапустите отладчик и попробуйте снова.

5 голосов
/ 28 марта 2011

Публикация на будущее для тех, кто сталкивается с такой же проблемой, несмотря на то, что это старая ветка.

Я столкнулся с «той же» проблемой и обнаружил, что у моего classpath было несколько экземпляров datanucleus-appengine-1.0.7.final.jar. Я узнал об этом из журнала, который мне подсказали, когда я пытался построить свое рабочее пространство. Вот содержимое журнала.

java.lang.RuntimeException: неожиданное исключение на com.google.appengine.tools.enhancer.Enhancer.execute (Enhancer.java:59) на com.google.appengine.tools.enhancer.Enhance. (Enhance.java:60) на com.google.appengine.tools.enhancer.Enhance.main (Enhance.java:41) Вызывается: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.Method.invoke (Method.java:597) на com.google.appengine.tools.enhancer.Enhancer.execute (Enhancer.java:57) ... еще 2 Вызвано: org.datanucleus.exceptions.NucleusException: плагин (Bundle) "org.datanucleus.store.appengine" уже зарегистрирован. Убедитесь, что у вас нет нескольких версий JAR одного и того же плагина в classpath. Файл URL ": / G: /eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.3.4_1.3.4.v201005212032/appengine-java-sdk-1.3.4/lib/user/orm/datanucleus-appengine -1.0.7.final.jar "уже зарегистрирован, и вы пытаетесь зарегистрировать идентичный плагин, расположенный по адресу URL" file: / G: /WS_Quotemandu/quotemandu/war/WEB-INF/lib/datanucleus-appengine-1.0. 7.final.jar «. в org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle (NonManagedPluginRegistry.java:434) в org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle (NonManagedPluginRegistry.java:340) в org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions (NonManagedPluginRegistry.java:222) в org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints (NonManagedPluginRegistry.java:153) в org.datanucleus.plugin.PluginManager.registerExtensionPoints (PluginManager.java:82) в org.datanucleus.OMFContext. (OMFContext.java:160) в org.datanucleus.enhancer.DataNucleusEnhancer. (DataNucleusEnhancer.java:172) в org.datanucleus.enhancer.DataNucleusEnhancer. (DataNucleusEnhancer.java:150) в org.datanucleus.enhancer.DataNucleusEnhancer.main (DataNucleusEnhancer.java:1157) ... еще 7

G: /eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.3.4_1.3.4.v201005212032/appengine-java-sdk-1.3.4/lib/user/orm/datanucleus-appengine-1.0. 7.final.jar

Файл: / G: /WS_Quotemandu/quotemandu/war/WEB-INF/lib/datanucleus-appengine-1.0.7.final.jar

Надеюсь, это поможет!

2 голосов
/ 18 июня 2009

Я видел что-то очень похожее раньше, и это было связано с тем, что persistantManager вызывался разными методами одновременно. Это происходит потому, что предполагается, что pm - это single instance (который не является singleton , поэтому вам придется управлять им самостоятельно)

Могут измениться условия между средой разработки и рабочей, когда она была развернута, что может объяснить и то, что вы видите.

Проблема была решена путем использования synchronized в объявлениях методов, использующих pm.

Может быть, это не ваш случай, но вы могли бы попробовать.

1 голос
/ 06 апреля 2016

Проверьте версию вашего компилятора. Это должно быть 1,7 или меньше. Не должно быть 1,8. Я также получил то же самое, и я изменил компилятор, тогда он работал для меня.

1 голос
/ 08 февраля 2014

У меня была такая же проблема, вызванная установкой 2 версий.

Сначала я установил Google App Engine SDK 1.8.8 , затем пришло обновление и затмение загружено Google App Engine Sdk 1.8.9 .

Наличие 2 версий вызвало появление этой ошибки. Несмотря на то, что все скомпилировано хорошо, я не осознавал, что журнал консоли datanucleus Enhancer предупреждает меня об этой ошибке во время компиляции, просто обнаружил, что консоль существует;

В моем случае решение состояло в том, чтобы сохранить только более новую версию, удалив старую:

  • Щелкните правой кнопкой мыши по объекту -> Свойства
  • Детализация до Google / App Engine
  • Справа вы увидите ссылку кнопки с именем Настройка SDK
  • Откроется новое окно со всеми установленными версиями SDK
  • Выберите нежелательные версии и нажмите кнопку Удалить

enter image description here

Чтобы полностью удалить старую версию (1.8.8):

  • Открыть файловый менеджер C:\Users\XXX\.eclipse\org.eclipse.platform_4.3.0_1709980481_win32_win32_x86_64\plugins, где XXX - ваш пользователь Windows.
  • Если папка com.google.appengine.eclipse.sdkbundle_1.8.8 существует, удалите ее!

Теперь, если вы откроете консоль энхансера datanucleus, класс будет успешно улучшен.

datanucleus enhancer console log

0 голосов
/ 10 ноября 2015

У меня была такая же проблема. В моем случае код был правильно обработан во время сборки с помощью maven clean + install, см. Ниже выдержку из журнала:

УЛУЧШЕНО (персистентно): nl.jdoexample.model.Product УЛУЧШЕНО (персистентно): nl.jdoexample.model.Book

Что пошло не так, так это то, что при выполнении (в Intellij) перед выполнением (см. Для этих конфигураций Run / Debug) была выполнена команда 'make', удалив тем самым улучшенные файлы Java. Это привело к появлению ошибки.

Исправление проблемы в Intellij (но также может быть сделано в Eclipse или Netbeans): - JDO-пример - Жизненный цикл: - отредактировать конфигурацию (Run / Debug Configurations): - JDO-пример [установить] Командная строка: чистая установка

  • Запуск / отладка конфигураций: -Заявка: - Удалить «сделать» - Новое определение исполнения: - Имя: выполнить основной jdoExample - Конфигурация: - Основной класс: nl.jdoexample.main

Таким образом, приложение не будет снова скомпилировано перед выполнением, что приведет к удалению расширенных файлов Java. Это было успешно в моей ситуации. Надеюсь, это поможет.

0 голосов
/ 17 июня 2009

«Класс com.wayd.server.beans.WinePost» не является постоянным версия), или метаданные / аннотации для класса не найдены. "

Так почему бы не проверить каждое из этих 3 условий? Одно из них верно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...