这是我的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 找了很久,没有找到原因, |
|
控制层调用,有没有注入?相关注入代码贴上来看看
|
|
有注入的 @Autowired public ReasonShowService reasonShowService; |
|
再一个,我调试的时候,看着参数能够正常传递,在service层和control层都是正常的 |
|
1. reasonShowService所在的类有没有加上@Service之类的注解? |
|
1.reasonShowService不需要@Service这样的注解的了,一直都是这么用的,没有问题。我用的是spring MVC |
|
10分 |
疑问:使用@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(readOnly = true)去掉也可以成功运行,但这种方式明显没有前面两种好。 |
楼上大神,确实,以非事务方式运行可以了 |
|
楼主弱弱的问句,reasonShowService.callResult(map);调用之后,怎么把cursor转换为list 的,我一直报错oracle.jdbc.driver.OracleResultSetImpl cannot be cast to java.util.ArrayList,不知道楼主可知道什么情况?或者能不饿能够把您java的部分代码都贴出来,俺瞅瞅。。。
|