使用ssh做项目,spring与hibernate能够整合,事物处理采用的是UploadFileDAOProxy方式,我自己写了个test的类,完全没有问题。但是我把完全一样的代码放在servlet里却报如下错误:
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
2008-4-28 23:03:55 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet Upload threw exception
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UploadFileDAOProxy' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer
Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer
at org.springframework.aop.framework.Cglib2AopProxy.createEnhancer(Cglib2AopProxy.java:223)
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:150)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
at org.springframework.aop.framework.AbstractSingletonProxyFactoryBean.getProxy(AbstractSingletonProxyFactoryBean.java:187)
at org.springframework.aop.framework.AbstractSingletonProxyFactoryBean.afterPropertiesSet(AbstractSingletonProxyFactoryBean.java:159)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1198)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1167)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:285)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:122)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:66)
at com.estar.services.dao.UploadServlet.doPost(UploadServlet.java:34)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
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:175)
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:844)
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)我spring配置文件相关内容如下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> <bean id="UploadFileDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 注意这个属性, 详细意义请参考Spring文档中的CGLIB部分或者本章的
10.7.2参考资料部分, 必须为 true 使用CGLIB才不用强制编写DAO接口 -->
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref bean="UploadFileDAO" />
</property>
<property name="transactionAttributes">
<props>
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
serlvet里的代码如下:ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UploadFileDAO uploadFileDao = (UploadFileDAO)ctx.getBean("UploadFileDAOProxy");
UploadFile uploadFile = new UploadFile();
uploadFile.setFileName("adfdn");
uploadFile.setFileSize("567" );
uploadFile.setFilePath("fasdfa");
uploadFileDao.save(uploadFile);

解决方案 »

  1.   

    重点看一下java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer,这个是引起错误的主要原因。没有你的代码,我没有办法具体定位。
      

  2.   

    遇到类似的问题不需要读太多的异常信息,只抽取主要部分..如NoClassDefFoundError 类似这样的异常信息.围绕这一条信息问题基本就能解决
    配置文件的问题..
      

  3.   

    1.log4j:WARN No appenders 
    如果你是用tomcat运行应用,请尝试除去你工程中的common-logger包2.对于第二个错,不太清楚你这段代码到底放在哪里
    也不清楚你到底是如何调试的。
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    这种语句,建议抽取出来,建个单态,不要一直初始化。
    错误的解释是UploadFileDAOProxy未能成功初始化,至于NoClassDefFoundError错误,如果你确实test没问题
    就可以无视,只能说,你调试的方法或者说方式有问题,导致了类路径,也就是classpath异常。
    对于NoClassDefFoundError这类错误,最直观的方法是你直接去tomcat下的工程,确认lib目录下,所有的包都
    是正确的。
    最大的可能性是,部署应用的时候,Spring环境变量的包,未能部署到tomcat工程下
      

  4.   

    如果项目类库同时存在asm.jar和asm x-x-x.jar,试试将asm x-x-x.jar删除,可能是这两个文件冲突