有时候,你认为出问题的地方并不是你想的地方。
明明数据库都设置了id自增,xml也做了相关的配置
useGeneratedKeys="true" keyProperty="id" @Resource private static AccountMapper accountMapper; |
但数据insert依然报空指针异常,控制台很明显可以看出id为null导致的异常,于是静下心来想想,结果发现插入的这个mapper被我放在一个工具类里了,方法设为了静态,所以变量mapper也被设置为static,编译时没有任何问题,但是一跑起来就一直是空指针异常,其实跟MyBatis没啥关系,是因为spring没法注入静态变量,类被加载字节码的时候变量已经初始化了,也就是给该变量分配内存了,导致spring忽略静态变量。所以上面的写法自然就错了。
Spring 依赖注入是依赖set方法,静态变量不属于对象,只属于类。解决方法就是加上非静态的set方法,如下:
private AccountMapper accountMapper; @Resource public void setAccountMapper(AccountMapper accountMapper) { this.accountMapper = accountMapper; } |
或者在spring的配置文件中配置(说白了也是set方法,都一样)
<bean value="test" class="x.x.x.Util"> <property value="accountMapper" ref="accountMapper"/> </bean> |