最近花了一周的时间想弄弄sturts2+spring3+hibernate4组合,就在网上下载了最近的struts2(struts-2.3.4.1)、hibernate4、spring3。写好类和配置文件其中配置文件代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [ <!ENTITY contextInclude SYSTEM "org/springframework/web/portlet/context/WEB-INF/contextInclude.xml"> ]> <beans> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/defauction?useUnicode=true&characterEncoding=UTF-8"></property> <property name="user" value="root"></property> <property name="password" value="420322"></property> <!-- 指定连接数据库连接池的最大连接数 --> <property name="maxPoolSize" value="20"/> <!-- 指定连接数据库连接池的最小连接数 --> <property name="minPoolSize" value="1"/> <!-- 指定连接数据库连接池的初始化连接数 --> <property name="initialPoolSize" value="1"/> <!-- 指定连接数据库连接池的连接的最大空闲时间 --> <property name="maxIdleTime" value="20"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mappingResources"> <list> <value>AuctionUser.hbm.xml</value> <value>Bid.hbm.xml</value> <value>Item.hbm.xml</value> <value>Kind.hbm.xml</value> <value>State.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <!-- <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> --> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.generate_statistics">true</prop> <prop key="hibernate.connection.release_mode">auto</prop> <prop key="hibernate.autoReconnect">true</prop> <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> <!--prop key="hibernate.current_session_context_class">thread</prop> --> <!--使用二级缓存 --> </props> </property> </bean> <!-- 配置数据库的事务管理器--> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" abstract="false" lazy-init="default" autowire="default" dependency-check="default"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <!-- 事务拦截器bean需要依赖注入一个事务管理器 --> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <!-- 下面定义事务传播属性--> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="find*">PROPAGATION_REQUIRED</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 定义BeanNameAutoProxyCreator--> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 指定对满足哪些bean name的bean自动生成业务代理 --> <property name="beanNames"> <!-- 下面是所有需要自动创建事务代理的bean--> <list> <value>mgr</value> </list> <!-- 此处可增加其他需要自动创建事务代理的bean--> </property> <!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器--> <property name="interceptorNames"> <list> <!-- 此处可增加其他新的Interceptor --> <value>transactionInterceptor</value> </list> </property> </bean> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="smtp.163.com"/> <property name="javaMailProperties"> <props> <prop key="mail.smtp.auth">true</prop> <prop key="mail.smtp.timeout">25000</prop> </props> </property> <property name="username" value="dml124"/> <property name="password" value="dml420322"/> </bean> <bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="[email protected]"/> <property name="subject" value="竞价通知"/> </bean> <bean id="mgr" class="com.service.impl.AuctionManagerImpl"> <property name="userDao" ref="auctionUserDao"/> <property name="bidDao" ref="bidDao"/> <property name="itemDao" ref="itemDao"/> <property name="kindDao" ref="kindDao"/> <property name="stateDao" ref="stateDao"/> <property name="mailSender" ref="mailSender"/> <property name="message" ref="mailMessage"/> </bean> <!-- <bean id="checkWiner" class="com.schedule.CheckWiner"> <property name="mgr" ref="mgr"/> </bean> <bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="delay" value="0"/> <property name="period" value="86400000"/> <property name="timerTask" ref="checkWiner"/> </bean> <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTask"/> </list> </property> </bean> --> </beans>
写好了 dao,service,action各种Java代码。结果总是报错。错误: java.lang.reflect.InvocationTargetExceptio;
部分代码如下
Session session = sessionFactory.openSession();
try {
Query query =sessionFactory.getCurrentSession().createQuery("from AuctionUser au where au.username= ? and au.userpass= ?"); query.setString(0, username);
query.setString(1, pass);
query.setMaxResults(1);
return (AuctionUser)query.uniqueResult();
}catch(Exception e){e.printStackTrace();} finally {
session.close();
}
红色部分代码报错,这个错误不会抛出异常,只会在页面显示上面的代码,研究好多天不知道为什么,实在没办法了就换各种jar包。将hibernate4的jar包换了,spring4的全都加进去了还是报错,最后将struts2的jar换为如下图
中的jar包就好了。而且我在想重现我用2.3.4包的报错再也呈现不了了,很不理解为什么会出现这种错误。。
不过在解决这个问题的过程中学习了,spring的动态代理和aop切面方式管理事务,都是将TrasactionManager 作为advise切入到被代理对象或者切入点。
hibernate4的事物能够独立完成事物的管理,因此需要开启事物级别为 requaried。还有待学习。
就是那个错误让我一周很头疼,也很郁闷。不过既然即觉了就多留意下。希望大家别犯同样的错误,即使犯了也可以能参考解决。解决不了可以给我留言。我能及时回复。。。