Widzę dziwny komunikat o błędzie i szukam pomysłów na temat tego, jaki może być problem. Jestem trochę nowy w używaniu WZP.Burza mózgów: Dziwny problem JPA, prawdopodobnie problem z wersją klasu lub słoika?
Mam aplikację, w której używam Spring Managera Entity Factory (LocalContainerEntityManagerFactoryBean), EclipseLink jako mój dostawca ORM, podłączony do MySQL DB i zbudowany z Maven. Nie jestem pewien, czy to ma znaczenie .....
Po wdrożeniu tej aplikacji na Glassfish aplikacja działa zgodnie z oczekiwaniami.
Problem polega na tym, że utworzyłem zestaw samodzielnych testów jednostkowych do uruchamiania poza Glassfish, które nie działają poprawnie. Pojawia się następujący błąd (Mam edycji nazwy klas trochę)
com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity
Obiekt nie może być oddane do klasy tego samego typu? Jak to możliwe?
Oto fragment kodu, który jest w błędzie
Query q = entityManager.createNamedQuery("MyEntity.findAll");
List entityObjects = q.getResultList();
for (Object entityObject: entityObjects) {
com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;
Wcześniej miałem ten kod, który wyprodukował ten sam błąd:
CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
cq.select(cq.from(com.xyz.abc.services.persistence.entity.MyEntity.class));
List entityObjects = entityManager.createQuery(cq).getResultList();
for (Object entityObject: entityObjects) {
com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;
Ten kod jest kwestia jest taka sama, że mam wdrożone na serwerze.
oto najgłębsza wyjątek czy to pomaga
Caused by: java.lang.ClassCastException: com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity
at com.xyz.abc.services.persistence.entity.factory.MyEntityFactory.createBeans(MyEntityFactory.java:47)
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:597)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:115)
... 37 more
Zgaduję, że istnieje jakiś słoik Używam w GlassFish, który jest inny niż te, które używam w teście. Sprawdziłem wszystkie słoiki, które wymieniłem jako "dostarczone" i jestem pewien, że wszystkie są takie same z Glassfish.
Daj mi znać, jeśli wcześniej widziałeś ten dziwny problem lub pomysły na jego poprawienie.
Tak OK, to wydaje się być problemem. Oto wynik: ładowarka klasa MyEntity jest ładowarka klasa [email protected] MyEntity obiektu jest org.springfr[email protected]16089a5 Teraz jak to naprawić ??? Zamierzam zagłębić się w artykuły, z którymi się łączyłeś. – Vinnie
@Vinnie Niestety nie znam używanych narzędzi, więc nie mogę zaoferować bardziej konkretnej pomocy. Powodzenia - będziesz go potrzebować ... –
OK, to prawdopodobnie błąd debiutanta, ale twoja sugestia (i rewelacja o użyciu różnych Classloaderów lokalnie) doprowadziły do praktycznego rozwiązania. Widząc, że w grze są różne Classloadery, pomyślałem, że Spring LocalContainerEntityManagerFactoryBean nie był właściwym wyborem podczas moich testów jednostkowych. Przełączyłem się na LocalEntityManagerFactoryBean (co również oznaczało, że potrzebowałem nowej jednostki wytrwałości, ponieważ nie mogłem wstrzyknąć DataSource) i rzeczy wydają się działać lokalnie teraz. Dzięki za pomoc! – Vinnie