Struts2+Spring3+Hibernate4+JavaEE6 配置
Struts2, Spring3, Hibernate4, JavaEE6, JDK 7, Tomcat8, MyEclipse 2014, MySQL 5, DBCP
本文参照自 使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境。所以不再这里赘述了。
这里说说这篇文章配置时遇到的问题吧:
博客写得很赞!做到4.7、编写单元测试代码这一步时候报出以下错误:
Loading properties file from class path resource [config.properties]
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userService' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1168)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:281)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956)
at com.hellossh.test.TestSpring.test(TestSpring.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
主要是数据库连接池的问题,那篇教程使用的是 Druid
连接池包 。在实例化的时候报错了。所以测试不通过。
可以查看这个提交。讲明了如何更换连接池包。这里更换为 dbcp
。
在 pom.xml
添加 dbcp
连接池的依赖。
<!-- dbcp --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><!-- dbcp -->
在 spring-hibernate.xml
中修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "><!-- JNDI方式配置数据源 --><!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="${jndiName}"></property> </bean> --><!-- 定义一个使用 DBCP 实现的数据源 --><bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="url" value="${jdbc_url}" /><property name="username" value="${jdbc_username}" /><property name="password" value="${jdbc_password}" /></bean><!-- 配置hibernate session工厂 --><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="hibernateProperties"><props><!-- web项目启动时是否更新表结构 --><prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop><!-- 系统使用的数据库方言,也就是使用的数据库类型 --><prop key="hibernate.dialect">${hibernate.dialect}</prop><!-- 是否打印Hibernate生成的SQL到控制台 --><prop key="hibernate.show_sql">${hibernate.show_sql}</prop><!-- 是否格式化打印出来的SQL --><prop key="hibernate.format_sql">${hibernate.format_sql}</prop></props></property><!-- 自动扫描注解方式配置的hibernate类文件 --><property name="packagesToScan"><list><value>me.gacl.model</value></list></property><!-- 自动扫描hbm方式配置的hibernate文件和.hbm文件 --><!-- <property name="mappingDirectoryLocations"> <list> <value>classpath:me/gacl/model/hbm</value> </list> </property> --></bean><!-- 配置事务管理器 --><bean name="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property></bean><!-- 注解方式配置事物 --><!-- <tx:annotation-driven transaction-manager="transactionManager" /> --><!-- 拦截器方式配置事物 --><tx:advice id="transactionAdvice" transaction-manager="transactionManager"><tx:attributes><!-- 以如下关键字开头的方法使用事物 --><tx:method name="add*" /><tx:method name="save*" /><tx:method name="update*" /><tx:method name="modify*" /><tx:method name="edit*" /><tx:method name="delete*" /><tx:method name="remove*" /><tx:method name="repair" /><tx:method name="deleteAndRepair" /><!-- 以如下关键字开头的方法不使用事物 --><tx:method name="get*" propagation="SUPPORTS" /><tx:method name="find*" propagation="SUPPORTS" /><tx:method name="load*" propagation="SUPPORTS" /><tx:method name="search*" propagation="SUPPORTS" /><tx:method name="datagrid*" propagation="SUPPORTS" /><!-- 其他方法不使用事物 --><tx:method name="*" propagation="SUPPORTS" /></tx:attributes></tx:advice><!-- 切面,将事物用在哪些对象上 --><aop:config><aop:pointcut id="transactionPointcut"expression="execution(* me.gacl.service..*Impl.*(..))" /><aop:advisor pointcut-ref="transactionPointcut"advice-ref="transactionAdvice" /></aop:config></beans>
不过现在提少企业使用
Hibernate4
了。