今天在servlet中加入spring元素时,遇到了一个applicationContext.xml无法读取的问题,项目可以正常启动,但是一到要引用spring中元素的时候就开始报NullPointerException了。
之前是在servlet代码中通过容器获取Spring中的对象,代码如下
//通过容器获取UserService ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); us = (UserService) ac.getBean("userService");
这时是可以正常读取.xml文件的。
因为只需要创建一个Spring的容器就可以了,所以可以通过配置监听器来达到我们的需求,在web项目创建时创建spring容器,销毁时关闭spring容器。这时在web.xml中配置监听器就行,配置如下图所示:
文件放置情况如下图:
配置后,servlet中的代码如下:
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
us = (UserService) wac.getBean("userService");
以上配置是能正常输出的情况。
接下来说一下我犯的错,刚开始在配置中写的是下面这句:
<listener-class>org.springframework.web.context.ContextLoader</listener-class>
,这时无论如何都是读取不到applicationContext.xml,找了网上的很多种解决方案,比如classpath和classpath*读取路径的区别,applicationContext.xml应该放置在哪个文件夹下等等,尝试无数次都没啥用。
我这个项目也没有使用Maven,也没有要将.xml文件过滤掉的问题。
关于Maven项目下.xml过滤的问题网上也有很多解决方案,下面挂一下我解决的代码:
<build>
<resources>
<resource>
<directory>src</directory>
<includes>
<include>applicationContext.xml</include>
<include>applicationContext_Annotation.xml</include>
</includes>
</resource>
</resources>
</build>
还有一种方法就是将.xml文件放入资源文件夹下,将文件夹设置成resource类型就行了。
继续说我自己给自己挖的坑,现在spring也没什么人用了,网上找的解决方案都是前几年或更早的,所以版本更新的问题就会导致我们现在才学的人很难找到正确的解决方案。IDEA现在也很智能,在web.xml中能找到的文件按Ctrl+鼠标左键一般都是能实现跳转的,如果路径不正确还会爆红提示,所以也不是我路径放置的问题。当我看到一篇解决方案的博客时,看到他使用的是org.springframework.web.context.ContextLoaderListener才发现我导错包了,修改之后瞬间就能成功运行了。所以眼睛是个好东西。。。