错误描述:在用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文件中设置资源扫描即可。