2010-12-04 23 views
1

Dans mon projet Google App Engine I a reçu une exception inattendue:Appengine: ClassCastException dans la requête avec chaîne de Leng

com.google.gwt.user.server.rpc.UnexpectedException: méthode de service « de java.lang public abstract .String org.learnjapanese.client.NewAccount.login (java.lang.String, java.lang.String) throws java.lang.IllegalArgumentException 'a jeté une exception inattendue: java.lang.ClassCastException: java.lang.Character ne peut pas être lancé à com.google.appengine.api.datastore.Key

at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:378) 
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:581) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:224) 

Ceci est mon JPA-code:

@Entity 
public class Test { 
@Id 
String id; 
} 

Et ceci est le code d'application:

EntityManager manager = EMF.get().createEntityManager(); 

Query q = manager.createQuery("select x from Test x where id = '12'"); 
List l = q.getResultList(); // No problem here 

q = manager.createQuery("select x from Test x where id = '1'"); 
l = q.getResultList(); // java.lang.ClassCastException occurs here. 

Il se trouve qu'une requête avec une chaîne de longueur 1 provoque l'exception, tandis que la chaîne de longueur 2 ne fonctionne pas. Quelqu'un peut-il expliquer ce qui se passe ici? Y at-il un travail autour?

+1

'" select x from Test x où id = \ "1 \" "' – thejh

+0

Cela le résout, il ne déclenche pas l'exception. Il est étrange cependant, parce que la spécification indique que les littéraux de chaîne sont entourés de guillemets simples (http://download.oracle.com/docs/cd/E14571_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_lit) – bspoel

+0

Il peut être un problème avec le moteur de l'application: Le problème sur http://code.google.com/p/datanucleus-appengine/issues/detail?id=21 est très similaire – bspoel

Répondre

0

En Java, un seul caractère entre guillemets simples est interprété comme un littéral char. Il semble que ce soit ce qui se passe lorsque vous utilisez '1' dans votre déclaration. La trace de la pile parle d'une instance de java.lang.Character qui est ce que vous auriez si un char était auto-boxé. Cela ressemble à un bug dans le framework que vous utilisez. Que se passe-t-il lorsque vous faites cela?