Code Bye

spring配合Mybatis 调用有返回结果集的存储过程,总是报java.lang.nullpointerexception 错误

这是我的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分会不会太少?

控制层调用,有没有注入?相关注入代码贴上来看看
引用 1 楼 oh_Maxy 的回复:

控制层调用,有没有注入?相关注入代码贴上来看看

有注入的

	@Autowired
	public ReasonShowService reasonShowService;
引用 1 楼 oh_Maxy 的回复:

控制层调用,有没有注入?相关注入代码贴上来看看

再一个,我调试的时候,看着参数能够正常传递,在service层和control层都是正常的

引用 2 楼 gdmcbingo 的回复:
Quote: 引用 1 楼 oh_Maxy 的回复:

控制层调用,有没有注入?相关注入代码贴上来看看

有注入的

	@Autowired
	public ReasonShowService reasonShowService;

1. reasonShowService所在的类有没有加上@Service之类的注解?
2. reasonShowService所在的类,扫描配置的包路径包含它没?

引用 4 楼 oh_Maxy 的回复:
Quote: 引用 2 楼 gdmcbingo 的回复:
Quote: 引用 1 楼 oh_Maxy 的回复:

控制层调用,有没有注入?相关注入代码贴上来看看

有注入的

	@Autowired
	public ReasonShowService reasonShowService;

1. reasonShowService所在的类有没有加上@Service之类的注解?
2. reasonShowService所在的类,扫描配置的包路径包含它没?

1.reasonShowService不需要@Service这样的注解的了,一直都是这么用的,没有问题。我用的是spring MVC
2.已经全部有@Autowired的注解了,不需要再扫描service和dao文件,只需要扫描control文件即可


10分
引用 5 楼 gdmcbingo 的回复:
Quote: 引用 4 楼 oh_Maxy 的回复:
Quote: 引用 2 楼 gdmcbingo 的回复:
Quote: 引用 1 楼 oh_Maxy 的回复:

控制层调用,有没有注入?相关注入代码贴上来看看

有注入的

	@Autowired
	public ReasonShowService reasonShowService;

1. reasonShowService所在的类有没有加上@Service之类的注解?
2. reasonShowService所在的类,扫描配置的包路径包含它没?

1.reasonShowService不需要@Service这样的注解的了,一直都是这么用的,没有问题。我用的是spring MVC
2.已经全部有@Autowired的注解了,不需要再扫描service和dao文件,只需要扫描control文件即可

疑问:使用@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试试呗?

Map<String,Object> map= new HashMap<String,Object>();
map.put(“sqlparm”,sqlparm);
map.put(“outresult”,OracleTypes.CURSOR);//这句没用,删除

mybatis部分没有太大问题,报空指针,你就看Spring的注入吧。


30分
出错是事务机制的原因

可以在你调用的方法上修改事务传播机制,修改如下:
@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)去掉也可以成功运行,但这种方式明显没有前面两种好。

引用 8 楼 yyyuuu111 的回复:

出错是事务机制的原因

可以在你调用的方法上修改事务传播机制,修改如下:
@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)去掉也可以成功运行,但这种方式明显没有前面两种好。

楼上大神,确实,以非事务方式运行可以了
,因为之前一直都是用的事务方式运行

楼主弱弱的问句,reasonShowService.callResult(map);调用之后,怎么把cursor转换为list 的,我一直报错oracle.jdbc.driver.OracleResultSetImpl cannot be cast to java.util.ArrayList,不知道楼主可知道什么情况?或者能不饿能够把您java的部分代码都贴出来,俺瞅瞅。。。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明spring配合Mybatis 调用有返回结果集的存储过程,总是报java.lang.nullpointerexception 错误