Pourquoi est-ce que j'obtiens ClassNotPersistableException lors de l'exécution de l'application GWT App Engine en mode hébergé?
Je suis au hasard d'obtenir un org.datanucleus.des exceptions.ClassNotPersistableException lorsque j'essaie d'exécuter une requête sur le local JDO banque de données de mon GWT/application App Engine. Cela se produit uniquement quand je lance l'application sur mode Hébergé. Quand je le déployer sur le Google App Engine, tout fonctionne parfaitement.
Trace De La Pile:
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 classe est très simple JDO persistance capable de classe:
@PersistenceCapable(identityType = IdentityType.DEMANDE)
public class 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;
}
}
La banque de données de la requête est effectuée par la méthode suivante:
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;
}
source d'informationauteur Otavio
Vous devez vous connecter pour publier un commentaire.
Je suis assez sûr il n'y a rien de mal avec votre code. La raison pour laquelle vous obtenez cette erreur est dû à un problème avec le Datanucleus enhancer.
Si vous voyez ce message d'erreur, quittez la Jetée et de la vérification de la console à l'intérieur de l'Éclipse (vous aurez besoin de choisir la bonne console dans la petite barre d'outils au-dessus de la fenêtre de la console). Il devrait dire quelque chose comme:
DataNucleus Enhancer (version 1.1.4) : Amélioration de classes
DataNucleus Enhancer terminé avec succès pour X classes. Horaires : entrée=547 ms, améliorer=76 ms, total=623 mme. Consulter le journal pour plus de détails
... où X est le nombre de classes qu'il a traitées. Le nombre doit être égal au nombre de "entité" classé vous avez défini.
Mais parfois, pour une raison quelconque, il va dire 0, ce qui est pourquoi vous obtenez le ClassNotPersistableException erreur.
De fixer, d'ouvrir une classe d'entité et de changer quelque chose (ajouter un espace ou quelque chose) et enregistrer. Vérifiez la console jusqu'à ce qu'il dit qu'il a amélioré l'ensemble de vos classes d'entités. Puis redémarrez le débogueur et essayez à nouveau.
Affichage pour la future référence pour toute personne en cours d'exécution dans le même problème, alors que c'est un vieux thread.
J'ai rencontré le même problème, et trouvé que mon classpath avait plusieurs instances de datanucleus-appengine-1.0.7.final.jar. J'ai appris à connaître ce à partir du journal qui a été invité quand j'ai essayé de construire mon espace de travail. Voici le contenu du journal.
java.lang.RuntimeException: exception Inattendue
au com.google.appengine.outils.enhancer.Enhancer.execute(Enhancer.java:59)
au com.google.appengine.outils.enhancer.Améliorer.(Améliorer.java:60)
au com.google.appengine.outils.enhancer.Améliorer.principal(à l'Améliorer.java:41)
Causés par: java.lang.de réfléchir.InvocationTargetException
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke0(Native method)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
au coucher du soleil.de réfléchir.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
à java.lang.de réfléchir.La méthode.invoke(la Méthode.java:597)
au com.google.appengine.outils.enhancer.Enhancer.execute(Enhancer.java:57)
... 2 plus
Causés par: org.datanucleus.des exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.magasin.appengine" est déjà enregistré. Vous assurer que vous n'avez pas plusieurs JAR versions d'un même plugin dans le classpath. L'URL "file:/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" est déjà inscrit et que vous essayez d'enregistrer un nombre identique de plugin située à l'adresse URL "file:/G:/WS_Quotemandu/quotemandu/war/WEB-INF/lib/datanucleus-appengine-1.0.7.final.jar."
au org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:434)
au org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:340)
au org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:222)
au org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.java:153)
au org.datanucleus.plugin.PluginManager.registerExtensionPoints(PluginManager.java:82)
au org.datanucleus.OMFContext.(OMFContext.java:160)
au org.datanucleus.enhancer.DataNucleusEnhancer.(DataNucleusEnhancer.java:172)
au org.datanucleus.enhancer.DataNucleusEnhancer.(DataNucleusEnhancer.java:150)
au org.datanucleus.enhancer.DataNucleusEnhancer.principale(DataNucleusEnhancer.java:1157)
... 7 plus
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
file:/G:/WS_Quotemandu/quotemandu/war/WEB-INF/lib/datanucleus-appengine-1.0.7.final.jar
Espérons que cette aide!
J'ai vu quelque chose de très similaire avant et elle était liée à la persistantManager d'être appelé par des méthodes différentes en même temps. Cela se produit parce que le pm est censé être un seule instance (ce qui n'est pas un singleton de sorte que vous devez gérer vous-même).
Conditions pourraient changer entre l'environnement de développement et de la production, une fois déployé, ce qui pourrait expliquer aussi ce que vous voyez.
Le problème a été résolu en utilisant
synchronized
dans les déclarations de méthodes qui utilisent le pm.C'est peut-être pas votre cas, mais vous pourriez voulez donner un coup de feu.
J'ai eu le même problème, causé par le fait d'avoir 2 versions installées.
Première fois que j'avais installé Google App Engine Sdk 1.8.8puis une mise à jour est venu et eclipse téléchargé Google App Engine Sdk 1.8.9.
Avoir les 2 versions de la cause de cette erreur est levée. Malgré tout compilé eh bien, je ne savais pas que datanucleus enhancer journal de la console a été de me prévenir à propos de cette erreur sur le temps de compilation, juste découvert que la console existé 😉
La solution, dans mon cas, était de ne garder que la version la plus récente de supprimer l'ancienne:
Pour assurer l'ancienne version (1.8.8) a été entièrement supprimée:
C:\Users\XXX\.eclipse\org.eclipse.platform_4.3.0_1709980481_win32_win32_x86_64\plugins
où XXX est votre nom d'utilisateur Windows.com.google.appengine.eclipse.sdkbundle_1.8.8
existe, supprimez-le!Maintenant, si vous ouvrez le datanucleus enhancer console, la classe apparaît avec succès amélioré.
Vérifier votre version de compilateur. Il devrait être de 1,7 ou moins. Il ne devrait pas être de 1,8. J'ai aussi eu la même chose et j'ai changé le compilateur, puis il a travaillé pour moi.
J'ai eu le même problème.
Dans mon cas, le code a été correctement traitées lors de la construction de la via maven clean + installer, voir ci-dessous l'extrait de l'enregistrement:
AMÉLIORÉ (Permanent) : nl.jdoexample.de modèle.Produit
RENFORCÉE (Permanent) : nl.jdoexample.de modèle.Livre
Ce qui s'est passé est que lors de l'exécution (en Ide) avant l'exécution (voir pour ce Run /Debug Configurations) la commande 'make' a été exécuté, supprimant ainsi le renforcement de fichiers java. Ce qui a causé l'erreur de pop-up.
La réparation du problème à l'Ide (mais peut également être fait dans Eclipse ou Netbeans):
- jdo-exemple
- Cycle de vie:
- modifier la configuration (Run /Debug Configurations):
- jdo-exemple [installer]
Ligne de commande: installation propre
-Application:
- Supprimer le 'faire'
- La nouvelle de l'exécution de la définition:
- Nom: exécutez le principal jdoExample
- Configuration:
- Classe principale: nl.jdoexample.principal
De cette façon, l'application ne sera pas compilé de nouveau avant l'exécution, supprimant ainsi le renforcement de fichiers java.
Ce fut un succès dans ma situation. Espérons que cette aide.
"La classe "com.wayd.serveur.les haricots.WinePost" n'est pas permanent. Cela signifie qu'il n'a pas été amélioré, ou que la version améliorée du fichier n'est pas dans le CLASSPATH (ou est caché par une version sans agent de contraste), ou les Méta-Données/annotations pour la classe ne sont pas trouvées."
Alors pourquoi ne pas vérifier chacun de ces 3 conditions ? L'un d'eux est vrai.