不得不写的一篇博客sturts2+spring3+hibernate4的问题

            最近花了一周的时间想弄弄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&amp;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;

java.lang.reflect.InvocationTargetException

部分代码如下

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。还有待学习。

    就是那个错误让我一周很头疼,也很郁闷。不过既然即觉了就多留意下。希望大家别犯同样的错误,即使犯了也可以能参考解决。解决不了可以给我留言。我能及时回复。。。

你可能感兴趣的:(不得不写的一篇博客sturts2+spring3+hibernate4的问题)