• Mapper method 'com.xxxx.other.dao.MyDao.getNo attempted to return null from a method with a primitive return type (int)


    使用myBatis调用存储过程的返回值,提示错误信息:

    org.apache.ibatis.binding.BindingException: Mapper method 'com.xxxx.other.dao.MyDao.getNo attempted to return null from a method with a primitive return type (int).

    先查mysql监控语句,发现存储过程调用正常,也得到了返回值,继续查

    对应的文件

    存储过程:

    CREATE PROCEDURE `Get_Table_Flow_No`(IN `输入表名` VARCHAR(100), IN `待取数` INT, OUT `输出要取的最大流水号` INT)
    BEGIN
    	DECLARE `willRetNo` INT;
    
    	SET `输出要取的最大流水号` = 0 ;
    
    	SELECT 字段_已取最大流水号 INTO `willRetNo`  FROM 流水号保存表  WHERE 字段_表名=`输入表名` for UPDATE;  
    
    	IF `willRetNo` IS NULL  THEN
    		SET `willRetNo` = `待取数` ;
    		INSERT INTO `流水号保存表`
    			(字段_表名,字段_已取最大流水号,字段_上次获取时间)
    		VALUES (`输入表名`, `willRetNo`, NOW());
    	ELSE
    		SET `willRetNo` = `willRetNo` + `待取数` ;
    
    		UPDATE `流水号保存表`
            SET 字段_已取最大流水号 = `willRetNo` 
    			, 字段_上次获取时间 = NOW()
    		WHERE 字段_表名=`输入表名` ;
    	END IF;  
            
        SET `输出要取的最大流水号` = `willRetNo`;
     
    END
    

      MyDao.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.xxxx.other.dao.MyDao">
        <parameterMap type="java.util.Map" id = "FlowNoMap">
            <parameter property="输入表名" mode="IN" jdbcType="VARCHAR"/>
            <parameter property="待取数" mode="IN" jdbcType="INTEGER"/>
            <parameter property="返回最大数值" mode="OUT" jdbcType="INTEGER"/>
        </parameterMap>
    
        <select id="getFlowNo" parameterMap="FlowNoMap" statementType="CALLABLE">
            <if test="_databaseId == 'mysql'">
                 call Get_Table_Flow_No(#{输入表名 ,jdbcType=VARCHAR,mode=IN},#{待取数,jdbcType=INTEGER,mode=IN},#{返回最大数值 ,jdbcType=INTEGER,mode=OUT});
            </if>
            <if test="_databaseId == 'sqlserver'"></if>
        </select>
    
    </mapper>
    

      MyDao.java

    package com.xxxx.other.dao;
    
    import org.apache.ibatis.annotations.Param;
    import org.springframework.dao.DataAccessException;
    
    import java.util.List;
    import java.util.Map;
    
    public interface MyDao {
        int getNo(Map<String, Object> parameterMap) throws DataAccessException;
    }
    

    错误信息出在:

    org/apache/ibatis/binding/MapperMethod.java 方法 execute 中

        if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) {
          throw new BindingException("Mapper method '" + command.getName() 
              + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");
        }
    

      因为result 为 null,所以抛出了异常,往上推,同文件中

    else if (SqlCommandType.SELECT == command.getType()) {
          if (method.returnsVoid() && method.hasResultHandler()) {
            executeWithResultHandler(sqlSession, args);
            result = null;
          } else if (method.returnsMany()) {
            result = executeForMany(sqlSession, args);
          } else if (method.returnsMap()) {
            result = executeForMap(sqlSession, args);
          } else {
            Object param = method.convertArgsToSqlCommandParam(args);
            result = sqlSession.selectOne(command.getName(), param);
          }
        }
    

     调用的是最后一个条件:

    Object param = method.convertArgsToSqlCommandParam(args);
    result = sqlSession.selectOne(command.getName(), param);
    调用的存储过程中,只是把值通过输出参数返回出来,没提供select语句,所以result为空,但param中有对"返回最大数值"取到值
    再返回报错的地方,看到有验证条件: !method.returnsVoid() ,实际在myDao.xml中是没有返回的,查询 MyDao.java,
    接口中有返回值: int getNo(Map<String, Object> parameterMap) throws DataAccessException;
    把 int 调整为 void, 程序运行正常,通过 parameterMap 取到了最大数
  • 相关阅读:
    3-剑指Offer: 连续子数组的最大和
    2-剑指offer: 最小的K个数
    1-剑指offer: 数组中出现次数超过一半的数字
    django中运行定时任务脚本
    django+sqlite进行web开发(二)
    django+sqlite3进行web开发(一)
    TL-WDN5200H无线usb网卡在Linux上的使用
    比较好用的C++11在线编译器
    MarkDown中如何加入上标和下标
    3. 卷积神经网络(CNN)
  • 原文地址:https://www.cnblogs.com/Wicher-lsl/p/11338750.html
Copyright © 2020-2023  润新知