java.lang.Long无法强制转换为java.lang.String

时间:2009-11-09 22:04:17

标签: google-app-engine exception jsp

我需要在jsp中迭代List<myClass>。这就是我获取列表的方式:

(当我评论它时,页面加载得很好)。

 <%
      List<myClass> pjList = null;
      StringBuffer ejbQuery = new StringBuffer();

      EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistence");
      EntityManager em = emf.createEntityManager();

      ejbQuery.append("SELECT e ");
      ejbQuery.append("FROM myClass e ");
      pjList = em.createQuery(ejbQuery.toString()).getResultList();


for(myClass pj : pjList)
{
    %>
    <br />
    <%= pj.getSomeField()%>
    <br />
    <%
}
%>

这是我在google appengine中运行时遇到的错误。在当地运行良好。

Uncaught exception from servlet
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
 at org.datanucleus.store.appengine.DatastoreFieldManager.fetchStringField(DatastoreFieldManager.java:188)
 at org.datanucleus.state.AbstractStateManager.replacingStringField(AbstractStateManager.java:1180)
 at ar.edu.kennedy.proveedores.entities.ProEnteEy.jdoReplaceField(ProEnteEy.java)
 at ar.edu.kennedy.proveedores.entities.ProPersonaJuridicaEy.jdoReplaceField(ProPersonaJuridicaEy.java)
 at ar.edu.kennedy.proveedores.entities.ProEnteEy.jdoReplaceFields(ProEnteEy.java)
 at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772)
 at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791)
 at org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:443)
 at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo(DatastoreQuery.java:433)
 at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo(DatastoreQuery.java:391)
 at org.datanucleus.store.appengine.query.DatastoreQuery.access$800(DatastoreQuery.java:97)
 at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply(DatastoreQuery.java:515)
 at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply(DatastoreQuery.java:507)
 at org.datanucleus.store.appengine.query.StreamingQueryResult.resolveNext(StreamingQueryResult.java:137)
 at org.datanucleus.store.appengine.query.StreamingQueryResult$1.computeNext(StreamingQueryResult.java:163)
 at org.datanucleus.store.appengine.query.AbstractIterator.tryToComputeNext(AbstractIterator.java:132)
 at org.datanucleus.store.appengine.query.AbstractIterator.hasNext(AbstractIterator.java:127)
 at org.datanucleus.store.appengine.query.StreamingQueryResult$AbstractListIterator.hasNext(StreamingQueryResult.java:229)
 at org.apache.jsp.busqueda_jsp._jspService(busqueda_jsp.java:138)

如果我使用ListIterator并调用hasNext(),我会得到同样的错误。帮助我了解发生了什么,如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

看起来你对“myclass”的映射是错误的。

有一个标记为“String”的字段,实际上它是一个“数字”。

从StackTrace看起来似乎是从数据库中获取值,然后将其转换为字符串。

由于该值不是字符串,因此您将获得该异常。

尝试在您的类中识别哪些“数字”值被映射为String并将其修复。一个接一个地开始,直到它工作。

答案 1 :(得分:1)

问题是,在您的类myClass中有一个String类型的字段,它由数据库中的整数表示。 DataNucleus JDO正在尝试将此值转换为Long,而不是String,因此是错误。您需要确保对象的数据类型与数据存储中的数据匹配。

答案 2 :(得分:0)

我只能猜测myClass与其描述(可能是基于XML的;-)在持久层中不匹配。

答案 3 :(得分:0)

我使用java创建了web服务,在我的本地计算机(Windows XP)中使用tomcat 6版本格式化为pdf。但是在我的服务器(并且有tomcat 7)的unix上,它抛出了一个错误java.lang.ClassCastException:java.lang.Long无法强制转换为java.lang.Integer。 我一直在寻找答案,最后我通过将服务器中的tomcat版本从7更改为6来解决问题。我认为可能会帮助其中一些人,他们遇到了这样的问题。

答案 4 :(得分:-5)

criteria.add(Expression.like("status", 115));

错误:java.lang.classCastException:java.lang.Integer无法强制转换为java.lang.String

这样做:

criteria.add(Expression.like("status", new String("115")));