使用maven构建的多模块项目:LisFunction.jar、YkLis.war。YkLis.war依赖LisFunction.jar,LisFunction.jar包含mybatis文件、dao、service层,YkLis.war包含controller及jsp页面。LisFunction模块的文件结构如下:
YkLis模块的文件结构如下:
applicationContext.xml配置文件内容如下:
<context:annotation-config/>
<context:component-scan base-package="com.yklis.lisfunction.dao" />
<context:component-scan base-package="com.yklis.lisfunction.service.impl" />
<!-- 读入属性文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- 在项目包之外配置是为了部署、升级更方便 -->
<value>file:/yklis-cfg/jdbc.properties</value>
</list>
</property>
</bean>
<!-- 数据源配置 -->
<bean id="dataSource_master" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="initialPoolSize" value="${jdbc.pool.initialPoolSize}"></property>
<property name="maxIdleTime" value="${jdbc.pool.maxIdleTime}"></property>
<property name="maxPoolSize" value="${jdbc.pool.maxPoolSize}"></property>
<property name="minPoolSize" value="${jdbc.pool.minPoolSize}"></property>
<property name="checkoutTimeout" value="${jdbc.pool.checkoutTimeout}"></property>
</bean>
<!-- 定义JdbcTemplate Bean.这样就可以在JAVA代码中通过@Autowired将Spring容器中的Bean注入进来 -->
<!-- 如果不在这里定义,也可以在JAVA代码中进行如下定义 -->
<!-- JdbcTemplate jdbcTemplate = new JdbcTemplate(); -->
<!-- jdbcTemplate.setDataSource(ds); -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource_master" />
</property>
</bean>
<!-- 注解方式配置事务 -->
<!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
<!-- 声明式事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource_master" />
</bean>
<!-- 事务增强 -->
<!-- 默认查找名为transactionManager的事务管理器,如果 事务管理器命名为transactionManager,则可不指定transaction-manager属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 切点表达式语言定义目标方法 -->
<!-- 第一个*代表所有的返回值类型
第二个*代表所有的类
第三个*代表类所有方法
最后一个..代表所有的参数 -->
<!-- 决定了不能在service层切换数据源。可以执行,但切换不成功(不会报错) -->
<aop:config>
<aop:pointcut id="servicesMethod" expression="execution(* com.yklis.lisfunction.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicesMethod" />
</aop:config>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath*:MyBatis-Configuration.xml"></property>
<property name="dataSource" ref="dataSource_master" />
</bean>
<!-- 配置扫描器,扫描value下的所有接口,然后创建各自接口的动态代理类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yklis.lisfunction.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
启动时报错如下:
2017-09-27 15:58:41 [localhost-startStop-1] INFO org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:285) - Root WebApplicationContext: initialization started
2017-09-27 15:58:42 [localhost-startStop-1] INFO org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:510) - Refreshing Root WebApplicationContext: startup date [Wed Sep 27 15:58:42 CST 2017]; root of context hierarchy
2017-09-27 15:58:42 [localhost-startStop-1] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]
2017-09-27 15:58:42 [localhost-startStop-1] INFO org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:172) - Loading properties file from URL [file:/yklis-cfg/jdbc.properties]
2017-09-27 15:58:42 [MLog-Init-Reporter] INFO com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger.log(Slf4jMLog.java:203) - MLog clients using slf4j logging.
2017-09-27 15:58:42 [localhost-startStop-1] INFO com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger.log(Slf4jMLog.java:203) - Initializing c3p0-0.9.5.1 [built 16-June-2015 00:06:36 -0700; debug? true; trace: 10]
2017-09-27 15:58:43 [localhost-startStop-1] WARN org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(AbstractBeanFactory.java:1432) - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
2017-09-27 15:58:43 [localhost-startStop-1] WARN org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(AbstractBeanFactory.java:1432) - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
2017-09-27 15:58:43 [localhost-startStop-1] WARN org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:487) - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.yklis.lisfunction.dao.WorkerDao com.yklis.lisfunction.service.impl.WorkerServiceImpl.workerDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.yklis.lisfunction.dao.WorkerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
YkLis模块的文件结构如下:
applicationContext.xml配置文件内容如下:
<context:annotation-config/>
<context:component-scan base-package="com.yklis.lisfunction.dao" />
<context:component-scan base-package="com.yklis.lisfunction.service.impl" />
<!-- 读入属性文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- 在项目包之外配置是为了部署、升级更方便 -->
<value>file:/yklis-cfg/jdbc.properties</value>
</list>
</property>
</bean>
<!-- 数据源配置 -->
<bean id="dataSource_master" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="initialPoolSize" value="${jdbc.pool.initialPoolSize}"></property>
<property name="maxIdleTime" value="${jdbc.pool.maxIdleTime}"></property>
<property name="maxPoolSize" value="${jdbc.pool.maxPoolSize}"></property>
<property name="minPoolSize" value="${jdbc.pool.minPoolSize}"></property>
<property name="checkoutTimeout" value="${jdbc.pool.checkoutTimeout}"></property>
</bean>
<!-- 定义JdbcTemplate Bean.这样就可以在JAVA代码中通过@Autowired将Spring容器中的Bean注入进来 -->
<!-- 如果不在这里定义,也可以在JAVA代码中进行如下定义 -->
<!-- JdbcTemplate jdbcTemplate = new JdbcTemplate(); -->
<!-- jdbcTemplate.setDataSource(ds); -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource_master" />
</property>
</bean>
<!-- 注解方式配置事务 -->
<!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
<!-- 声明式事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource_master" />
</bean>
<!-- 事务增强 -->
<!-- 默认查找名为transactionManager的事务管理器,如果 事务管理器命名为transactionManager,则可不指定transaction-manager属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 切点表达式语言定义目标方法 -->
<!-- 第一个*代表所有的返回值类型
第二个*代表所有的类
第三个*代表类所有方法
最后一个..代表所有的参数 -->
<!-- 决定了不能在service层切换数据源。可以执行,但切换不成功(不会报错) -->
<aop:config>
<aop:pointcut id="servicesMethod" expression="execution(* com.yklis.lisfunction.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicesMethod" />
</aop:config>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath*:MyBatis-Configuration.xml"></property>
<property name="dataSource" ref="dataSource_master" />
</bean>
<!-- 配置扫描器,扫描value下的所有接口,然后创建各自接口的动态代理类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yklis.lisfunction.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
启动时报错如下:
2017-09-27 15:58:41 [localhost-startStop-1] INFO org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:285) - Root WebApplicationContext: initialization started
2017-09-27 15:58:42 [localhost-startStop-1] INFO org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:510) - Refreshing Root WebApplicationContext: startup date [Wed Sep 27 15:58:42 CST 2017]; root of context hierarchy
2017-09-27 15:58:42 [localhost-startStop-1] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]
2017-09-27 15:58:42 [localhost-startStop-1] INFO org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:172) - Loading properties file from URL [file:/yklis-cfg/jdbc.properties]
2017-09-27 15:58:42 [MLog-Init-Reporter] INFO com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger.log(Slf4jMLog.java:203) - MLog clients using slf4j logging.
2017-09-27 15:58:42 [localhost-startStop-1] INFO com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger.log(Slf4jMLog.java:203) - Initializing c3p0-0.9.5.1 [built 16-June-2015 00:06:36 -0700; debug? true; trace: 10]
2017-09-27 15:58:43 [localhost-startStop-1] WARN org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(AbstractBeanFactory.java:1432) - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
2017-09-27 15:58:43 [localhost-startStop-1] WARN org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(AbstractBeanFactory.java:1432) - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
2017-09-27 15:58:43 [localhost-startStop-1] WARN org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:487) - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.yklis.lisfunction.dao.WorkerDao com.yklis.lisfunction.service.impl.WorkerServiceImpl.workerDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.yklis.lisfunction.dao.WorkerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
解决方案 »
- html中调用.js文件,能传递变量到该js文件吗?
- [高分][紧急][在线等]请问如何截取文章的一部分作为摘要?
- ireoprt 报表在html中显示的问题,困扰好多天了,求大家帮帮忙!!!
- 求教:struts中实现文件下载路径设置的问题
- struts的一个小问题,送分了!
- Hibernate的带参的更新操作!
- 初学struts 遇到问题,请大虾帮忙,up有分!
- 谁有Displaytag啊
- 为何我的网页中的字体显示乱码呢?
- 请教关于用tomcat做连接池问题?
- EasyUI下拉框change后文本框的数据变了,但是这行数据的所有控件都不能编辑了,这是怎么回事?
- idea整合ssm框架启动时报错
service 接口怎么注入的啊? 单独一个配置文件?
<property name="configLocation" value="classpath*:MyBatis-Configuration.xml"></property>
<property name="dataSource" ref="dataSource_master" />
</bean>YkLis.war作为web项目,MyBatis-Configuration.xml也要在它下面而不是LisFunction.jar