盲人摸象--web应用集成spring调试经历
呃,这是补的上周的一篇笔记,集成spring并非我本人,而是作为邪恶的交换,帮一个朋友调试,他帮我安装一个运筹学的软件matlab,由于全是英文懒得弄,虽然这一笔生意看起来我是亏了,因为我弄了近三个小时。。。 不过是值得的。。
自己接触web应用以来,应该有两年了。 但是真正的算接触,或者说入门web应用,应该只有半年。。 不得不说这半年我成长了很多哈哈哈。有一丝吹牛的成分,不过确实是这样。
至于集成spring,大概在两年前我啥也不懂的时候,便跟着教程“集成”过 ssh,ssm框架的应用。。 现在看来确实没啥用,因为那个时候超纲超的太严重了。 题外话说了很多便到此为止。
说到web应用,服务器啥的不说了。 由于我接触的较多的是tomcat,因此以下的内容都是基于tomcat。 我认为一个web应用对于用户而言,最重要的莫过于web.xml文件。 它的重要性就相当于main方法。。之所以说是对用户来说最重要的,那是因为tomcat容器本身帮我们完成了很多事情。。
这次的调试过程我也是从web.xml入手。
问题的原由:
朋友的环境是,idea下的web项目,集成了maven的spring-web,spirng-webmvc,mybatis的相关依赖,以及一些必要的包。配置好了mybatis的内容,webmvc的内容,spirng的内容,以及数据源的配置等。 所有的内容都似乎是正常的。 但是运行起来的时候,@Controler注解始终没有生效。。 表现出来的内容,访问配置的路径始终是404。
朋友的致误点在于: 将内容加载的监听器,漏写了Listener,写成了ContextLoader,神奇的是恰好也存在这个类。
以上的这个web.xml中,包括了几乎所有的servlet规范的三个重要的内容,监听器,过滤器,servlet。
将监听器正确的设置之后,出现了新的问题。。 那就是spring-mvc.xml解析出错。spring-mvc.xml的内容:
它的内容很明显,即不能被正确解析。。 就是这样一个即不显眼,但是却致命的问题很烦人。 经历了相当长一段时间的尝试和各种寻找方法,真的算是盲人摸象了。 因此,又冒出来一个新的内容:spring.xml,和 spirng-mybatis.xml相继出现问题。。 这里想提一下的是,它们的名称应该也是可以自定义的。 比较嘲讽的是,它们是同样的问题,无法解析beans。
当所有的问题都解决了之后,惊奇的发现任然是404。。
这可难受了,以我目前的能力能够处理倒这一步已经是奇迹了。。 摆在面前的就是是一个黑盒,完全不知道怎么下手。。。 眼看时间已经过了两个多小时。是时候展现真正的技术了。
将所遇到的问题梳理一遍,将可能出现的问题给演练一遍。。 打断点调试,发现dispatcherServlet时被加载过的,应该也被实例化过。。 而相对的, 配置的controller则并没有被加载过。。 也就是说bean没有被注册到spring容器中。。 难道是注解不对? 翻看以前的源码,发现steroro.Controller注解没毛病啊。。 那么是servlet的配置不对吗? 依次排除。。 都不是。。
所以,处理问题的途径有两种: 一种去找以有的经验; 一种是去自己探索。。 优先级自然是从易到难。
最后抱着尝试的态度改了一个参数,竟然好了。。 万万没想到。
原来朋友使用的那个开启注解功能的bean,是较早版本的适配器,已经被废弃。。 这里是修改过后的。。 他原来使用的是:
DefaultAnnotationHandlerMapping。。 可以看到在idea中用了一个横线将它给划掉。。 这个错误的源头便是这里。。 也很正常,毕竟这里注解识别不到的直接后果便是bean不能被spring容器识别,导致背后的所有的功能都不能被实现。。
所以说,版本很重要。尤其是对于那些产品更新维护较频繁的产品。