2009-11-09 5 views
3

jsp에서 List<myClass>을 반복해야합니다. 이것은 목록을 얻는 방법입니다.java.lang.Long은 java.lang.String으로 변환 할 수 없습니다.

(내가 주석을 달았을 때 페이지가 잘로드 됨).

<% 
     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 App Engine에서 실행할 때 발생하는 오류입니다. 로컬로 잘 실행됩니다.

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()를 호출하면 동일한 오류가 발생합니다. 무슨 일이 일어나고 있는지, 어떻게 해결할 수 있는지 이해할 수있게 도와주세요.

+0

참고 : 실제 환경에서 내 지속성 공급자는 싱글 톤이며 서블릿의 클래스에서 쿼리를 수행하지만 관련 코드를 복사하여 List의 출처를 확인할 수 있습니다. – rec

답변

2

"myclass"의 매핑이 잘못되었습니다.

사실 "숫자"일 때 "문자열"로 표시된 필드가 있습니다.

StackTrace에서 발생하는 것으로 보이는 것은 데이터베이스에서 값을 가져온 다음 문자열에 캐스팅 한 것입니다.

값이 문자열이 아니기 때문에 예외가 발생합니다.

"숫자"값이 String으로 매핑되어 고정되어 있는지 확인하는 것이 좋습니다. 작동 될 때까지 하나씩 시작하십시오.

+0

데이터베이스가없고 단지 영구적 인 클래스라는 것에주의하십시오. 이 경우 불일치가 존재할 수 있습니까? – rec

+1

자신이 관리하는 데이터베이스가 없을 수도 있고 datanucleus에 익숙하지 않더라도 내부적으로 사용할 수있는 큰 기회가 있습니다. 데이터베이스를 지속성으로 사용하지 않더라도 데이터를 "마샬링"및 "언 마샬링"하고 매핑을 사용하여이를 수행하는 방법을 알 수 있습니다.귀하의 문제는 "지도" – OscarRyz

+0

예, 이전 데이터가 이전 필드 유형과 함께 저장되었으며 쿼리는 이전 데이터와 새 데이터 (!)를 반환했습니다. 클래스 멤버 유형의 변경으로 인해 이전 데이터를 삭제하면 문제가 해결되었습니다. – rec

0

myClass가 퍼시스턴스 계층의 설명 (아마도 XML 기반의 ;-)과 일치하지 않는다고 추측 할 수 있습니다.

1

문제는 클래스 myClass에 데이터베이스의 정수로 나타내는 String 유형의 필드가 있다는 것입니다. DataNucleus JDO는이 값을 String이 아닌 Long으로 변환하려고 시도하므로 오류가 발생합니다. 개체의 데이터 유형이 데이터 저장소의 데이터와 일치하는지 확인해야합니다.

+0

데이터베이스가없고 단지 영구적 인 클래스라는 것에주의하십시오. 이 경우 불일치가 존재할 수 있습니까? – rec

+0

오스카 레이즈 (Oscar Reyes)와 마찬가지로 기본 구현은 JDO 기능을 사용하고있는 것으로 보입니다. –

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

오류 : java.lang.ClassCastException가 : java.lang.Integer의는

이 좋아하세요 java.lang.String의 캐스팅 할 수 없습니다

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

내가 함께 웹 서비스를 생성 내 로컬 컴퓨터 (Windows XP)에서 tomcat 6 버전으로 PDF 형식으로 변환하는 java. 하지만 유닉스에서 내 서버 (그리고 바람둥이 7이 있음)에 java.lang.ClassCastException 오류가 발생했습니다 : java.lang.Long을 java.lang.Integer로 형변환 할 수 없습니다. 나는 대답을 찾고 마침내 서버에서 tomcat 버전을 7에서 6으로 변경하여이 문제를 해결했습니다. 저는이 문제를 만난 사람들 중 일부가 도움이 될 것이라고 생각합니다.

관련 문제