测试Spring定时任务时在Dao层报空指针异常

断点调试代码走到Dao后报空指针异常,在Dao层的代码比较简单就在方法里一句:
return this.findListBySqlId("findSqlByMap", paraMap);
然后把框架封装的代码提取出来
public List findListBySqlId(String sqlId, Map<?, ?> paraMap)
    /*     */   {
    /* 195 */     List list = null;
    System.out.println(getSession());
    /*     */     try {
    /* 197 */       String hql = getSqlStatementById(sqlId, paraMap);
    /* 198 */       if (StringUtils.isNotBlank(hql)) {
    /* 199 */         Query query = getSession().createSQLQuery(hql);
    /* 200 */         query.setCacheable(SysPropertiesUtil.getBoolean("use_query_cache", false));
    /* 201 */         setQueryParameters(query, paraMap);
    /* 202 */         list = query.list();
    /*     */       } else {
    /* 204 */         throw new BasalException(BasalException.ERROR, "未在 SqlMap配置文件中配置, ID为" + sqlId + 
    /* 205 */           "hql 语句");
    /*     */       }
    /*     */     } catch (Exception e) {
    /* 208 */       throw new BasalException(BasalException.ERROR, e.getCause().getMessage(), e.getCause());
    /*     */     }
    /* 210 */     return list;
    }


代码走到Query query = getSession().createSQLQuery(hql);后就被捕获异常,报NullPointException。
怀疑是getSession()没有获取到session,所以报空指针,在这行代码前面加入System.out.println(getSession());再次测试。
果然控制台报:
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
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.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:111)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)
这样问题就比较清晰了,是由于Hibernate中无法获取到spring管理的session对象。
一般可以通过注解和非注解的方式进行事务配置。
Spring整合Hibernate配置
<!-- Hibernate 配置 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="entityInterceptor">
<ref local="hibernateInterceptor" />
</property> 
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${db.Dialect.prefix}.${db.Dialect.suffix}
</prop>
<prop key="hibernate.query.substitutions">
true '1', false '0'
</prop>
<prop key="hibernate.validator.apply_to_ddl">false</prop> 
                <prop key="hibernate.validator.autoregister_listeners">false</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.current_session_context_class">
org.springframework.orm.hibernate4.SpringSessionContext
</prop>
<prop key="jdbc.use_scrollable_resultset">false</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">
true
</prop>
<prop key="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
<prop
key="hibernate.cache.provider_configuration_file_resource_path">
classpath*:/ehcache-hibernate.xml
</prop>
</props>
</property>
<property name="mappingJarLocations">
<list>
</list>
</property>
<property name="packagesToScan">
<list>
<value>com.test.*.ntity</value>
</list>
</property>
</bean>


<!-- 事务管理器配置,单数据源事务 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<property name="nestedTransactionAllowed" value="true"></property>
</bean>

<!-- 使用annotation定义事务 -->
<!-- 注解方式配置事务    -->
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- 代理事务配置 -->
<bean id="txProxyTemplate" abstract="true" lazy-init="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>


然后在Service中的方法上添加@Transactional注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值