2011-11-16 14 views
5

Ciao e grazie per la visione ;-)Hibernate ClassCastException in GWT ospitato modalità solo

Il nostro problema/errore è:

javax.persistence.PersistenceException: [PersistenceUnit: PUname] Unable to build EntityManagerFactory 
... 
Caused by: org.hibernate.HibernateException: Could not instantiate dialect class 
... 
Caused by: java.lang.ClassCastException: org.hibernate.dialect.MySQLDialect cannot be cast to org.hibernate.dialect.Dialect 
... 

(vedi completa analisi dello stack in basso)

si verifica in un'applicazione Web basata su GWT che utilizza le seguenti tecnologie:

  • Maven
  • Hibernate EntityManager/JPA
  • Guice
  • GWT
  • GWT-P
  • GWT Maven plug
  • ...

Il fatto sottolineare è che funziona in Tomcat. Solo in modalità di sviluppo in modalità hosted (con Jetty), utilizzando GWT Maven Plugin (con obiettivo gwt: run), otteniamo ClassCastException. Stavamo giocando con le dipendenze di Hibernate senza fortuna (aggiungendo hibernate-validator e/o hibernate-jpa-2.0-api). ClassCastException viene lanciato all'avvio di JPA prima che venga effettivamente utilizzato qualsiasi servizio. BTW: JPA è l'impostazione utilizzando Guice:

install(new JpaPersistModule("PUname")); 
    filter("/*").through(PersistFilter.class); 

Può valere la pena di ricordare che disattivando l'impostazione dialetto (in persistence.xml) crea un altro ClassCastException anche JPA all'avvio:

javax.persistence.PersistenceException: [PersistenceUnit: dsmgmt] Unable to build EntityManagerFactory 
... 
Caused by: org.hibernate.HibernateException: Unable to instantiate specified TransactionFactory class [org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory] 
... 
Caused by: java.lang.ClassCastException: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory cannot be cast to org.hibernate.engine.transaction.spi.TransactionFactory 
... 

Perché lo fa rompere in Jetty? Cosa potrebbe causarlo o come può essere risolto?

File: META-INF/persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="PUname" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <class>our.test.class</class> 
     <properties> 
      <property name="hibernate.connection.username" value="user"/> 
      <property name="hibernate.connection.password" value="pass"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.connection.url" value="jdbc:mysql://machine:3306/db"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

nostri JAR nella webapp:

 445.288 antlr-2.7.7.jar 
     150.774 antlr-runtime-3.1.3.jar 
     4.467 aopalliance-1.0.jar 
     57.963 classmate-0.5.4.jar 
     575.389 commons-collections-3.2.1.jar 
     52.543 commons-exec-1.1.jar 
     59.590 commons-fileupload-1.2.2.jar 
     163.151 commons-io-2.1.jar 
     284.220 commons-lang-2.6.jar 
     313.898 dom4j-1.6.1.jar 
     131.929 dsmgmt-shared-0.1-SNAPSHOT.jar 
    1.006.424 ehcache-core-2.4.3.jar 
     710.492 guice-3.0.jar 
     36.998 guice-assistedinject-3.0.jar 
     27.633 guice-persist-3.0.jar 
     65.012 guice-servlet-3.0.jar 
    5.004.997 gwt-servlet-2.3.0.jar 
     28.339 gwtp-dispatch-server-0.6.jar 
     17.184 gwtp-dispatch-server-guice-0.6.jar 
     30.402 gwtp-dispatch-shared-0.6.jar 
     81.426 hibernate-commons-annotations-4.0.0.Final.jar 
    4.347.499 hibernate-core-4.0.0.CR6.jar 
     127.259 hibernate-ehcache-4.0.0.CR6.jar 
     471.832 hibernate-entitymanager-4.0.0.CR6.jar 
     102.661 hibernate-jpa-2.0-api-1.0.1.Final.jar 
     366.592 hibernate-validator-4.2.0.Final.jar 
     70.928 jandex-1.0.3.Final.jar 
     644.148 javassist-3.12.1.GA.jar 
     2.497 javax.inject-1.jar 
     60.542 jboss-logging-3.1.0.CR1.jar 
     11.209 jboss-transaction-api_1.1_spec-1.0.0.Final.jar 
     859.016 jna-3.2.3.jar 
     213.781 jsch-0.1.44-1.jar 
     281.579 jsoup-1.6.1.jar 
     481.535 log4j-1.2.16.jar 
     789.885 mysql-connector-java-5.1.18.jar 
    1.351.561 org.eclipse.jgit-1.0.0.201106090707-r.jar 
     601.287 pd4ml-3.80b1.jar 
     149.846 pd4ml-ss-css-3.80b1.jar 
     25.962 slf4j-api-1.6.4.jar 
     9.748 slf4j-log4j12-1.6.4.jar 
     743.673 sqljet-1.0.4.jar 
     172.023 stringtemplate-3.2.jar 
    1.889.196 svnkit-1.3.5.jar 
     251.371 trilead-ssh2-build213-svnkit-1.3-patch.jar 
     47.433 validation-api-1.0.0.GA.jar 
     109.318 xml-apis-1.0.b2.jar 

Lo stacktrace completa:

javax.persistence.PersistenceException: [PersistenceUnit: PUname] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:916) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:887) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 
    at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 
    at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77) 
    at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172) 
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:593) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 
Caused by: org.hibernate.HibernateException: Could not instantiate dialect class 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:82) 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:142) 
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:81) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:160) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:133) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71) 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2259) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2255) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:907) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:887) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 
    at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 
    at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77) 
    at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172) 
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:593) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 
Caused by: java.lang.ClassCastException: org.hibernate.dialect.MySQLDialect cannot be cast to org.hibernate.dialect.Dialect 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:73) 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:142) 
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:81) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:160) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:133) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71) 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2259) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2255) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:907) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:887) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 
    at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 
    at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77) 
    at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172) 
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:593) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 

Con i migliori saluti, Alexander

risposta

1

Ho anche affrontato questo problema. Dopo alcune indagini, ho scoperto che è un comportamento speciale del caricamento di classe di Google Eclipse Plugin + Jetty + Hibernate.

Particolari: Infatti durante la corsa o l'applicazione da Eclipse le librerie vengono caricate TWICE: prima istanza di applicazione di caricamento classe e la seconda volta al web applciation classloader del pontile. Hibernate ha uno speciale caricamento in classe che osserva durante il caricamento dei dialetti SQL nella verifica della gerarchia del classloader e come risultato che le istanze sono diverse.

Soluzione: Non vera soluzione di questo caso, ma sono riuscito a gestire con debuging GWT applcation sul server esterno Run As -> Web Applcaition (eseguito su server esterni)

Speranza che aiuta

0

L'applicazione di this patch a org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.java come descritto in HHH-7084 lo ha fatto per me (sostanzialmente sostituendo quella classe con la mia versione proprio come con lo jetty launcher for GWT hosted mode to get the JNDI stuff to work).

La risposta è molto probabilmente troppo tardi per essere di valore per Alexander (@ user845767) ma potrebbe essere utile per qualcun altro che viene qui in cerca di una soluzione.

0

utilizzando hibernate 4.1.4 - che ha risolto questo problema - risolto completamente il problema

Problemi correlati