这个异常,我碰到了两次。第一次是刚开始用SmartGWT的时候,碰到这个异常。
当时没多想,刷新了几次就可以了。现在想来,是因为SmartGWT启动的时候,会
自动的将它的资源展开,其中就包含 builtinTypes.xml。而因为我使用 eclipse开发,
这些自动展开的资源,并没有被刷新进eclipse。所以,当我下一次启动eclipse的时候,
eclipse会认为这些资源不存在。好解决,刷新一下eclipse就ok了。
第二次碰到这个异常,是昨天。根据经验主义,又认为是老问题。虽然也有点奇怪,明明
没有更新smartgwt,为啥它也会出现这种问题。于是删了那个目录,再刷新,还是不行。
还是不服气,于是又不停的折腾eclipse,最终也没搞出什么明堂来。
今天早上,冷静了一下,开始考虑这次异常的问题。
Problem loading builtinTypes.xml Exception when loading from __USE_CONTAINER__/pim8/sc/system/schema/builtinTypes.xml: java.lang.NullPointerException at com.isomorphic.io.ISCFile.<init>(ISCFile.java:145) at com.isomorphic.store.ProcessedFileCache.getObjectFromFile(ProcessedFileCache.java:135)
这次的异常和上次没有区别。不过看一下上下文,发现它出现的位置是在spring 的初始化当中
出现的。然后才开始出现 smartgwtee 自己的初始化。正好,昨天做了一个 spring 的bean,
然后又把这个bean从 BasicDataSource继承下来。而在启动的时候,spring首先启动,它自动
扫描所有的bean,发现了我的这个 DataSource,然后试图去装载它。在装载这个DataSource
的时候,SmartGwtEE被激活了。这个时候,servlet container还没有起来,它自然不能利用
servlet API去自动寻找到webroot。根据server.properties里面的说明,如果不能 auto detect
的话,它就会去找 __USE_CONTAINER__,而这个是没有设置的。所以,根本就不可能找到相应的
builtinTypes.xml,从而导致后面一系列的错误。所以,如果想用 spring-dmi,就不要把 datasource
之类的东西牵扯进来。
至于说有没有办法让 spring 在 smartgwtee之后启动起来,其实也是有的,只要把 spring 的
ContextLoaderListener 改成还是使用 ContextLoaderServlet 就可以了。这样,就算是
spring 先装载那个bean,也是在 servlet container完成之后做的。这个时候,相当于是在
spring 里面触发了 smartgwtee 的启动。