2012-04-03 3 views
0

우선, Tomcat에서 오류없이 응용 프로그램을 성공적으로 디버깅 할 수 있습니다. 물론 Tomcat에서 GWT 클라이언트 코드를 단계적으로 수행 할 수 없으므로이 옵션을 제공하는 Jetty에도 배포하려고합니다.GWT (Jetty) + Hibernate 4.1.1 (JPA) + c3p0 throw ClassCastException

그래서 이클립스에서 GWT (2.4.0), JPA와 c3p0를 사용하는 최대 절전 모드 4.1.1을 사용하는 응용 프로그램을 디버깅하려고하는데 다음과 같은 예외가 발생합니다.

Caused by: java.lang.ExceptionInInitializerError 
at SOMETHING.HibernateUtil.<clinit>(HibernateUtil.java:23) 
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.service.jdbc.connections.spi.ConnectionProvider] 
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:186) 
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:150) 
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131) 
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223) 
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89) 
at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75) 
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159) 
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131) 
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71) 
at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2273) 
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2269) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1738) 
at SOMETHING.HibernateUtil.<clinit>(HibernateUtil.java:20) 
... 29 more 
Caused by: org.hibernate.HibernateException: Could not instantiate connection provider [org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider] 
at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:192) 
at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:114) 
at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:54) 
at org.hibernate.service.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:69) 
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:176) 
... 41 more 
Caused by: java.lang.ClassCastException: org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider cannot be cast to org.hibernate.service.jdbc.connections.spi.ConnectionProvider 
at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:189) 
... 45 more 

예외가 발생한 RPC 호출 예외와 같은 정보를 제거했습니다.

public class HibernateUtil { 

private static final SessionFactory sessionFactory; 
private static ServiceRegistry serviceRegistry; 

static { 
    try { 
     Configuration configuration = new Configuration(); 
     configuration.configure(); 
     serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();   
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
    } catch (Throwable ex) { 
     // Log exception! 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

public static Session getSession() throws HibernateException { 
    return sessionFactory.openSession(); 
} 

public static SessionFactory get() { 
    return sessionFactory; 
} 
} 

내있는 hibernate.cfg.xml은 다음과 같습니다 : 내의 WebContent/WEB-INF/lib 폴더에

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <!-- Database connection settings --> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://localhost:3306/dbname?autoReconnect=true</property> 
    <property name="connection.username">dbuser</property> 
    <property name="connection.password">dbpass</property> 
    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">thread</property> 
    <!-- Disable the second-level cache --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property> 
    <!-- Drop and re-create the database schema on startup --> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <!-- hibernate.cfg.xml --> 


    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">1800</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property> 
    <property name="hibernate.c3p0.idle_test_period">10</property> 
    <property name="hibernate.c3p0.acquire_increment">5</property> 
    <!-- no "connection.pool_size" entry! -->  
    <!-- JDBC connection pool (use the built-in) --> 
    <!-- <property name="connection.pool_size">1</property> --> 
    <property name="hibernate.transaction.auto_close_session">false</property> 

    <!-- Mapping files --> 
      <!-- several mapping class files here --> 
</session-factory> 

라이브러리는

내 HibernateUtil과는 꽤 바닐라이다 :

antlr-2.7.7.jar 
c3p0-0.9.1.2.jar 
commons-collections-3.2.1.jar 
commons-logging-1.1.1.jar 
dom4j-1.6.1.jar 
gwt-oauth2-0.2-alpha.jar 
gwt-servlet.jar 
hibernate-c3p0-4.1.1.Final.jar 
hibernate-commons-annotations-4.0.1.Final.jar 
hibernate-core-4.1.1.Final.jar 
hibernate-jpa-2.0-api-1.0.1.Final.jar 
httpclient-4.1.3.jar 
httpcore-4.1.4.jar 
javassist-3.15.0-GA.jar 
jboss-logging-3.1.0.GA.jar 
jboss-transaction-api_1.1_spec-1.0.0.Final.jar 
log4j-1.2.14.jar 
mysql-connector-java-5.1.18-bin.jar 

Eclipse 빌드 경로에 hibernate-jpa-2.0-api-1.0.1.Final.jar이 있고 그 뒤에 hibernate-core-4.1.1.Final.jar이옵니다. 나머지는 Apache Tomcat 6, EAR, GWT SDK 2.4.0, JRE 1.6.0.26 및 내 lib 폴더에있는 모든 라이브러리 (hibernate-jpa-2.0-api-1.0.1.Finalhibernate-core-4.1.1.Final 포함)를 가리키는 웹 응용 프로그램 라이브러리입니다. 나는 c3p0 (최대 절전 모드 및/또는 실제 라이브러리)를 포함하여 아무런 소용이 없었습니다. 같은 오류. 또한 약간 더 오래된 버전의 Hibernate 4 라이브러리를 시도했지만, 같은 오류가 발생했다.

아이디어가 있으십니까?

답변

0

저는 이것이 부두 클래스 로더 문제라고 생각합니다. 실제로 기본 연결 프로 바이더의 결과 인 ClassCastException을 해결하기 위해 c3p0을 사용하려고 시도했을 때 같은 문제가 발생했습니다.이 문제는 this과 같은 해결책이 있어야한다고 생각합니다.

+0

감사합니다. 매트와 신속한 응답에 감사드립니다. 나는이 버그 보고서와 내 검색 중에 다른 SO 질문을 보았지만이 코드가 어디에 있어야하는지, 그리고 EJB와 물건에 대한 언급이 있는지 확실하지 않았다. 어떤 제안? 다시 한번 감사드립니다. – iliask

+0

나는 본다. 나는 org.hibernate.service.classloading.internal에서 ClassLoaderServiceImpl 클래스를 덮어 쓰고 부모를 위해 null을 포함하는 코드를 주입하기로되어있다. 물론 '다른 ValidatorFactory를 만들 수 없습니다'와 '기본 제공자를 찾을 수 없습니다.'와 같은 다른 괴물들도 만나지 만 ClassCastException 오류는 사라졌습니다. 너도 이것들에 뛰어 들었 니? – iliask

+0

알았어, 잘 했어! 나는'validation-api.1.0.0.GA.jar','slf4j-api-1.6.1.jar','slf4j-log4j12-1.6.1.jar' 및'hibernate-validator-4.2.0 .Final.jar'을 사용하여 행복하고 행복하게 만듭니다. :) – iliask