MyBatis java.lang.NullPointerException

错误描述:在用maven整合SSM框架时,在MyBatis层出现的 java.lang.NullPointerException。终极原因是没有引入 xxmapper.xml文件 

需求 :我测试  xxmapper.xml文件定义数据化持久化操作时遇到的问题。

前提:maven项目的构建和各类配置文件无误。

下面的就是简单是完成一个查询的功能的代码的测试。其实,这样的测试写法是有错误的,我在下面分析。

=========================Goods 实体类........略。==============
Goods{}
==========================GoodsMapper=========================
public interface GoodsMapper{
   List<String> queryTypes();
}
=========================GoodsMapper.xml======================
<mapper namespace="com.czy.mapper.GoodsMapper">
    <select id="queryTypes" resultType="String">
        select Types from goods
    </select>
</mapper>
========================GoodsService=========================
public interface GoodsService {
    public String[] queryTypes()
}
========================GoodsServiceImpl=====================
public class GoodsServiceImpl  implements GoodsService {
    @Autowired
    private GoodsMapper goodsMapper;
    /*我们可以在service直接测试,当然可以建立一个test包测试*/
    @Test
    public void test(){
        List<String> list  = goodsMapper.queryTypes();
            System.out.print(list);
    }

如果你是像我一样进行测试的话那一样会出现这个java.lang.NullPointerException异常的问题。如下错误详情:可以定把错误定位到当前的这个类的问题。goodsMapper.queryTypes(); 就这么一行代码,就是这个方法出现了问题。

如果你们不能确定是否是配置信息问题。可以参见这个 : https://blog.csdn.net/u014800380/article/details/81609067 

常见错误:@Autowire报错导致的NullPointerException

java.lang.NullPointerException
    at com.czy.service.impl.GoodsServiceImpl.test(GoodsServiceImpl.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

正确测试方法:要引入applicationContext.xml文件。前面失败原因:因为没有引入这个文件 ,无法进行扫描。@Autowired  无法注入xxmapper类。这时,你有可能会想,我们在运行整个项目时,我们只需@Autowired 注入就好,并没有引入这个文件。但是你可别忘了,在运行整个项目时,我们会加载web.xml文件,这个文件是在运行时就会编译的(因为如果这里配置错误,直接会终止服务器启动),我们配置了Spring的监听器,它会去扫描applicationContext.xml文件。

public class GoodsServiceImpl  implements GoodsService {
   @Autowired
   private GoodsMapper goodsMapper;
   private ApplicationContext applicationContext;
   @Before
   public void init(){
      applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
   }
   @org.junit.Test
   public void GetUserByIdTest(){
      List<String> list = goodsMapper.queryTypes(); 
      System.out.print(list);
   }
}

这个错误也是帮同学解决问题时发现,它说只要写这个注解就好:@Autowired。  我一直就深信不疑,spring框架也学了一段时间,对于这些注解只是了解一点,还不深知其含义。后来我翻了一下前面的笔记,@Autowired只是注入对象属性的。参考(https://blog.csdn.net/sinat_41803693/article/details/108588927),再仔细想了想,从始至终,我们好像都没用到applicationContext.xml的配置文件,它还注入个毛线啊。 

 我在网上找了很多的帖子,都没找到那个属于我的报错原因,于是我想着,可能是在源头上就错了,根本不能这样测试。我找了原来的MyBatis成功的demo,结果返回也是空指针异常。原来的测试也是引入applicationContext.xml 的文件进行测试。还是我Spring框架学的不精通。

但是在这个错误的探索过程中,也学到了其它的东西:

①知道maven的配置文件也可以写在java包下面,然后再pom.xml文件中设置资源扫描即可。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值