本来想把公司项目整理一下,把xml 配置换成注解方式自己重新搭了一个框架 struts2.2.1 + hibernate3.5.5 + spring2.5.6  ,搭框架也是十分不顺利,
靠google 和 baidu 解决 n 多 bug 后, 这个bug 让我束手无策,从上午10 点到 现在一直在找!无赖只好求助!不知道没有人遇到过.帮帮我.thanks!
在网上找到报我类似错也有(比如:http://zhongzhihua.iteye.com/blog/613305) 但是解决方法行不通,主要是autowired 自动装配问题.
关于自动装配问题也可以看看人家说的典型错误: http://www.blogjava.net/chaocai/archive/2007/12/04/165134.html 
先看看我代码和配置吧.整个项目结构也是三层//dao基础访问接口和实现
public interface IBaseDAO<T extends Serializable>{}@Repository
public class BaseDAOImpl<T extends Serializable> implements IBaseDAO<T> {
private SessionFactory sessionFactory; @Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
//get set 省略
}//service基础访问接口和实现
public interface IBaseService<T extends Serializable> {}
@Transactional
@Repository
public class BaseServiceImpl<T extends Serializable> extends HibernateDaoSupport implements IBaseService<T> {

protected static final Log log = LogFactory.getLog(BaseServiceImpl.class);

private IBaseDAO<T> dao;

protected IBaseDAO<T> getDao() {
return dao;
} public void setDao(IBaseDAO<T> dao) {
this.dao = dao;
}

@Autowired
public void setFortory(@Qualifier("sessionFactory") SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
}//过渡基础 dao 接口 和实现
public interface ICitCoreDAO<T extends Serializable> extends IBaseDAO<T>{}public class CitCoreDAOImpl<T extends Serializable> extends BaseDAOImpl<T> implements ICitCoreDAO<T> {}//过渡基础 service 接口 和实现
public interface ICitCoreService<T extends Serializable> extends IBaseService<T>{}public class CitCoreServiceImpl<T extends Serializable> extends BaseServiceImpl<T> implements ICitCoreService<T> {}//具体模块dao,service 接口 和实现1
public interface IBoardDAO extends ICitCoreDAO<Board>{}@Repository
public class BoardDAOImpl extends CitCoreServiceImpl<Board> implements IBoardService{}public interface IBoardService extends ICitCoreService<Board>{}@Service
@Transactional
public class BoardServiceImpl extends CitCoreServiceImpl<Board> implements IBoardService{ @Autowired
public void setDao(IBoardDAO dao){
super.setDao(dao);
}

protected IBoardDAO getDao(){
return (IBoardDAO)super.getDao();
}
}//具体模块dao,service 接口 和实现2
public interface ICategoryDAO extends ICitCoreDAO<Category>{}@Repository
public class CategoryDAOImpl extends CitCoreServiceImpl<Category> implements ICategoryService{}public interface IBoardService extends ICitCoreService<Board>{}
public interface ICategoryService extends ICitCoreService<Category>{}@Service 
@Transactional
public class CategoryServiceImpl extends CitCoreServiceImpl<Category> implements ICategoryService{ @Autowired
public void setDao(ICategoryDAO dao){
super.setDao(dao);
}

protected ICategoryDAO getDao(){
return (ICategoryDAO)super.getDao();
}
}applicationContext.xml <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="location">
     <value>/WEB-INF/properties/jdbc.properties</value>
  </property>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="autoCommitOnClose" value="true"/>
<property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/>
<property name="initialPoolSize" value="${cpool.minPoolSize}"/>
<property name="minPoolSize" value="${cpool.minPoolSize}"/>
<property name="maxPoolSize" value="${cpool.maxPoolSize}"/>
<property name="maxIdleTime" value="${cpool.maxIdleTime}"/>
<property name="acquireIncrement" value="${cpool.acquireIncrement}"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingLocations">
<list>
<value>classpath:/com/scirp/pojo/person/*.hbm.xml</value>
<value>classpath:/com/scirp/pojo/board/*.hbm.xml</value>
</list>
</property> 
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.show_sql=true
hibernate.format_sql=false
hibernate.query.substitutions=true 1, false 0
hibernate.jdbc.batch_size=20
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.cache.use_second_level_cache=false
hibernate.cache.use_query_cache=true
</value>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<context:component-scan base-package="com.scirp" />

<tx:annotation-driven transaction-manager="transactionManager" />
<aop:aspectj-autoproxy />

解决方案 »

  1.   


    tomcat 启动报错如下:2011-7-15 14:33:34 org.apache.catalina.core.AprLifecycleListener init
    信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin;C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin
    2011-7-15 14:33:34 org.apache.coyote.http11.Http11Protocol init
    信息: Initializing Coyote HTTP/1.1 on http-8080
    2011-7-15 14:33:34 org.apache.catalina.startup.Catalina load
    信息: Initialization processed in 328 ms
    2011-7-15 14:33:34 org.apache.catalina.core.StandardService start
    信息: Starting service Catalina
    2011-7-15 14:33:34 org.apache.catalina.core.StandardEngine start
    信息: Starting Servlet Engine: Apache Tomcat/6.0.18
    2011-7-15 14:33:35 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring root WebApplicationContext
    14:33:39,593  WARN org.hibernate.cache.EhCacheProvider:93 - Could not find configuration [org.hibernate.cache.UpdateTimestampsCache]; using defaults.
    14:33:39,593  WARN org.hibernate.cache.EhCacheProvider:93 - Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.
    14:33:39,984 ERROR org.springframework.web.context.ContextLoader:215 - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'boardServiceImpl': Autowiring of methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.scirp.service.board.impl.BoardServiceImpl.setDao(com.scirp.dao.board.IBoardDAO); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.scirp.dao.board.IBoardDAO] is defined: Unsatisfied dependency of type [interface com.scirp.dao.board.IBoardDAO]: expected at least 1 matching bean
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:256)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:998)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    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.deployDirectory(HostConfig.java:926)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    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.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.scirp.service.board.impl.BoardServiceImpl.setDao(com.scirp.dao.board.IBoardDAO); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.scirp.dao.board.IBoardDAO] is defined: Unsatisfied dependency of type [interface com.scirp.dao.board.IBoardDAO]: expected at least 1 matching bean
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:543)
    at org.springframework.beans.factory.annotation.InjectionMetadata.injectMethods(InjectionMetadata.java:117)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:253)
    ... 40 more
      

  2.   


    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.scirp.dao.board.IBoardDAO] is defined: Unsatisfied dependency of type [interface com.scirp.dao.board.IBoardDAO]: expected at least 1 matching bean
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:499)
    ... 42 more
    2011-7-15 14:33:39 org.apache.catalina.core.StandardContext listenerStart
    严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'boardServiceImpl': Autowiring of methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.scirp.service.board.impl.BoardServiceImpl.setDao(com.scirp.dao.board.IBoardDAO); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.scirp.dao.board.IBoardDAO] is defined: Unsatisfied dependency of type [interface com.scirp.dao.board.IBoardDAO]: expected at least 1 matching bean
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:256)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:998)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    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.deployDirectory(HostConfig.java:926)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    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.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.scirp.service.board.impl.BoardServiceImpl.setDao(com.scirp.dao.board.IBoardDAO); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.scirp.dao.board.IBoardDAO] is defined: Unsatisfied dependency of type [interface com.scirp.dao.board.IBoardDAO]: expected at least 1 matching bean
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:543)
    at org.springframework.beans.factory.annotation.InjectionMetadata.injectMethods(InjectionMetadata.java:117)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:253)
    ... 40 more
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.scirp.dao.board.IBoardDAO] is defined: Unsatisfied dependency of type [interface com.scirp.dao.board.IBoardDAO]: expected at least 1 matching bean
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:499)
    ... 42 more
    2011-7-15 14:33:40 org.apache.catalina.core.ApplicationContext log
    信息: Set web app root system property: 'webapp.root' = [C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\M_IJMIS\]
    2011-7-15 14:33:40 org.apache.catalina.core.ApplicationContext log
    信息: Initializing log4j from [classpath:log4j.xml]
    2011-7-15 14:33:40 org.apache.catalina.core.StandardContext listenerStart
    严重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
    java.lang.IllegalArgumentException: Invalid 'log4jConfigLocation' parameter: class path resource [log4j.xml] cannot be resolved to URL because it does not exist
    at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:156)
    at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.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.deployDirectory(HostConfig.java:926)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    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.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    2011-7-15 14:33:40 org.apache.catalina.core.StandardContext start
    严重: Error listenerStart
    2011-7-15 14:33:40 org.apache.catalina.core.StandardContext start
    严重: Context [/M_IJMIS] startup failed due to previous errors
    2011-7-15 14:33:40 org.apache.catalina.core.ApplicationContext log
    信息: Shutting down log4j
    2011-7-15 14:33:40 org.apache.catalina.core.ApplicationContext log
      

  3.   


    struts2 自动装配认是安照类型装配的,一般报这错原因是 一个接口有二个实现 而另一个类引用这个接口所以struts2 不知道装配那一个,这时这句话里中括号 No unique bean of type [com.scirp.dao.board.IBoardDAO] 会出现两个实现这个接口的类,这时很好判断!
    而我这个也报这个错但只有一个选择.所以很纳闷!经过反复测试才发现有一个dao接口dao实现类型不一样,然后找代码发 我上面写的代码 CategoryDAOImpl extends CitCoreServiceImpl<Category> ,二个实现的继承都写错了,我晕!
    写代码的确要小心.struts2 这样框架错误又不好,除非以前遇到过,可以快速定位错误! 哥一个杯具!