spring配合Mybatis 调用有返回结果集的存储过程,总是报java.lang.nullpointerexception 异常
spring配合Mybatis 调用有返回结果集的存储过程,总是报java.lang.nullpointerexception 错误
这是我的mapper的内容,resultMap中type的bean:Reason是按照返回结果集设置的。
下面是我的interface
服务层代码
控制层调用:
找了很久,没有找到原因,
最后只能用最原始的jdbc调用,希望大神给与指导
40分会不会太少?
------解决方案--------------------
疑问:使用@Autowired必须要有@Service吗?
答案:a、可以有;b、可以没有
a可以有:Spring文件中没有配置bean时两个必须有,否则确实@Service的话Spring无法找到对应的bean就会报异常。
b可以没有:在Spring文件中配置bean这对应的接口实现类不需要@Service,bean配置如下:
<bean id="crmOrderDao" class="com.companyName.projectName.dao.impl.CrmOrderDaoImpl" parent="BaseSqlMapClientDAO">
</bean>
这个要不你加上@Service试试呗?
------解决方案--------------------
出错是事务机制的原因
可以在你调用的方法上修改事务传播机制,修改如下:
@Transactional(propagation=Propagation.SUPPORTS)
public void callResult(Map<String, Object> map){
reasonShowMybatisDao.callResult(map);
}
或者
@Transactional(propagation=Propagation.NEVER)
public void callResult(Map<String, Object> map){
reasonShowMybatisDao.callResult(map);
}
这两个传播机制有一个共同点就是能以非事务的形式运行,所以直接把@Transactional(readOnly = true)去掉也可以成功运行,但这种方式明显没有前面两种好。
这是我的mapper的内容,resultMap中type的bean:Reason是按照返回结果集设置的。
<mapper namespace="cn.com.casking.statistics.dao.ReasonShowMybatisDao">
<resultMap type="cn.com.casking.statistics.domain.Reason" id="reasonMap">
<result property="id" column="ID"/>
<result property="organName" column="ORGAN_NAME"/>
<result property="praxisTitle" column="PRAXIS_TITLE"/>
<result property="subJectiveDesc" column="SUBJECTIVE_DESC"/>
</resultMap>
<select id="callResult" parameterType="java.util.HashMap" statementType="CALLABLE">
<![CDATA[
{call sp_query_que_sub_result(#{sqlparm,mode=IN,jdbcType=VARCHAR},#{outresult,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=reasonMap})}
]]>
</select>
</mapper>
下面是我的interface
@MyBatisRepository
public interface ReasonShowMybatisDao {
void callResult(Map<String, Object> map);
}
服务层代码
@Component
@Transactional(readOnly = true)
public class ReasonShowService {
@Autowired
private ReasonShowMybatisDao reasonShowMybatisDao;
public void callResult(Map<String, Object> map){
reasonShowMybatisDao.callResult(map);
}
控制层调用:
Map<String,Object> map= new HashMap<String,Object>();
map.put("sqlparm",sqlparm);
map.put("outresult",OracleTypes.CURSOR);
reasonShowService.callResult(map);//这句调用出错,报java.lang.nullpointerexception
找了很久,没有找到原因,
最后只能用最原始的jdbc调用,希望大神给与指导
40分会不会太少?
Mybatis 调用存储过程
nullpointerexception
------解决方案--------------------
疑问:使用@Autowired必须要有@Service吗?
答案:a、可以有;b、可以没有
a可以有:Spring文件中没有配置bean时两个必须有,否则确实@Service的话Spring无法找到对应的bean就会报异常。
b可以没有:在Spring文件中配置bean这对应的接口实现类不需要@Service,bean配置如下:
<bean id="crmOrderDao" class="com.companyName.projectName.dao.impl.CrmOrderDaoImpl" parent="BaseSqlMapClientDAO">
</bean>
这个要不你加上@Service试试呗?
------解决方案--------------------
出错是事务机制的原因
可以在你调用的方法上修改事务传播机制,修改如下:
@Transactional(propagation=Propagation.SUPPORTS)
public void callResult(Map<String, Object> map){
reasonShowMybatisDao.callResult(map);
}
或者
@Transactional(propagation=Propagation.NEVER)
public void callResult(Map<String, Object> map){
reasonShowMybatisDao.callResult(map);
}
这两个传播机制有一个共同点就是能以非事务的形式运行,所以直接把@Transactional(readOnly = true)去掉也可以成功运行,但这种方式明显没有前面两种好。