私は小さなSpringアプリケーションを開発しています。学生情報の詳細をデータベースに保存する必要があります。 SimpleFormControllerを1つ開発しました。 NetBeans + Hibernateマッピング+ Springを使用しました。プロジェクトをデプロイすると、次のエラーが発生します。
私のspring-config-db-applicationContext.xmlを以下に示します:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- Hibernate session factory -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<constructor-arg index="0">
<value>${driverClassName}</value>
</constructor-arg>
<constructor-arg index="1">
<value>${url}</value>
</constructor-arg>
<constructor-arg index="2">
<value>${username}</value>
</constructor-arg>
<constructor-arg index="3">
<value>${password}</value>
</constructor-arg>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<!-- <property name="configLocation">
<value>WEB-INF/classes/hibernate.cfg.xml</value>
</property> -->
<property name="mappingResources" >
<list>
<value>hibernate.cfg.xml</value>
</list>
</property>
<!-- <property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property> -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<!--<prop key="hibernate.hbm2ddl.auto">create</prop>-->
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
</beans>
次のエラーが発生します:
ERROR (org.springframework.web.context.ContextLoader:213) - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in URL [jndi:/localhost/Student/WEB-INF/classes/config/spring-db-applicationContext.xml]: Invocation of init method failed; nested exception is Java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1395)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:289)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:286)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:188)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:526)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:730)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:387)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.Java:270)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.Java:197)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.Java:47)
at org.Apache.catalina.core.StandardContext.listenerStart(StandardContext.Java:3843)
at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:4342)
at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:791)
at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:771)
at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:525)
at org.Apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.Java:627)
at org.Apache.catalina.startup.HostConfig.deployApps(HostConfig.Java:511)
at org.Apache.catalina.startup.HostConfig.check(HostConfig.Java:1231)
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.Apache.Tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.Java:297)
at com.Sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.Java:836)
at com.Sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.Java:761)
at org.Apache.catalina.manager.ManagerServlet.check(ManagerServlet.Java:1471)
at org.Apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.Java:824)
at org.Apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.Java:350)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:290)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.Java:196)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:235)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:233)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:191)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:525)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:128)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:286)
at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:845)
at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:583)
at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:447)
at Java.lang.Thread.run(Thread.Java:619)
Caused by: Java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.Java:47)
at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.Java:30)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.Java:24)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.Java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.Java:144)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.Java:116)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.Java:108)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.Java:104)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.Java:69)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.Java:117)
at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.Java:43)
at org.hibernate.Tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.Java:162)
at org.hibernate.Tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.Java:135)
at org.hibernate.Tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.Java:55)
at org.hibernate.Tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.Java:56)
at org.hibernate.Tuple.entity.EntityMetamodel.<init>(EntityMetamodel.Java:302)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.Java:434)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.Java:108)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.Java:61)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.Java:238)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1304)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.Java:813)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.Java:731)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.Java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1454)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1392)
... 48 more
Mar 12, 2010 5:32:28 PM org.Apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
Hibernateに必要なASMのバージョン(asm-1.5.3.jar)とSpringに必要なバージョンとの間に互換性がありません。しかし、実際、クラスパスにasm-2.2.3.jarがあるのはなぜなのでしょうか(ASMはそのような問題を避けるためにspring.jarとspring-core.jarにバンドルされています)。 HHH-2222 を参照してください。
ここでこの問題の解決策を見つけました: http://www.hildeberto.com/2008/05/hibernate-and-jersey-conflict-on.html
NoSuchMethodError javadocはこれを言います:
アプリケーションがクラスの指定されたメソッド(静的またはインスタンス)を呼び出そうとして、そのクラスにそのメソッドの定義がなくなった場合にスローされます。
通常、このエラーはコンパイラーによってキャッチされます。このエラーは、クラスの定義に互換性がない場合にのみ実行時に発生します。
あなたの場合、このエラーは、Webアプリがorg.objectweb.asm.*
クラスを定義する間違ったバージョンのJARを使用していることを強力に示します。
この種の問題を解決するには、依存関係POMに2つのjarを追加する必要があります(Mavenを使用する場合)
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
APIを* cglib --- to ---> cglib-nodep-2.2.jar * cglib-asm --- to ---> cglib- asm.jar(つまり、最新のもの)
いくつかの異なるライブラリバージョンを使用して、起動時にSpringを初期化するときに同じエラーが発生しましたが、クラスパスでこの順序でバージョンを取得するとすべてが機能しました(cpの他のライブラリは重要ではありませんでした):
Cglibの異なるバージョンとこの主題に関してグーグルで検索できる多くの貧弱なアドバイスの間には多くの非互換性があります(cglib-nodebの古いバージョンを使用するなど)。 Springの古代バージョン(2.5.6)で3日間このナンセンスと格闘した後、私は発見しました:
Pom.xmlを更新します
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.1</version>
</dependency>
Http-builderを依存関係に追加すると、同じエラーが発生しました。
私の場合、次のようにasmを除外するだけで解決できます。
compile('org.codehaus.groovy.modules.http-builder:http-builder:0.7'){
excludes 'xml-apis'
exclude(group:'xerces', module: 'xercesImpl')
excludes 'asm'
}