毕业设计之错误集锦(七)----专题版:spring与struts结合bug

1.spring中注入sessionFactory和action大小写bug

         这是spring配置文件中的sessionFactory注入过程
   <bean id="updateCreditDao" class="com.shiep.daoImpl.UpdateCreditDaoImpl">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean>
        <bean id="creditAction" class="com.shiep.action.UpdateCreditAction">
        <property name="updateCreditDao" ref="updateCreditDao"></property>
    </bean>
     上面的spring配置文件可以成功注入,但是当把图中红色的updateCreditDao的首字母大写,也就是变成如下
<bean id="UpdateCreditDao" class="com.shiep.daoImpl.UpdateCreditDaoImpl">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean>
        <bean id="creditAction" class="com.shiep.action.UpdateCreditAction">
        <property name="updateCreditDao" ref="UpdateCreditDao"></property>
    </bean>
     居然就报 空指针异常,有人能告诉我这是为什么吗?

.2.java.lang.NullPointerException
         这个异常在我的世界里就是儿科级别的,以至于有时候碰到空指针异常我还会笑一下,因为这是java异常里面最常见、最简单的一个异常,但是从昨天开始我改变了我的看法,这个异常从发生到解决23个小时(加上早上睡觉的5个小时),是我编程生涯里面最惨的一次,以至于到天亮了都没搞出了,下面就说一下,也为以后碰到的人提供一种解决的路径。
         由于前几天闲的蛋疼,就用驱动精灵更新了一下所有的驱动,结果造成笔记本无法正常关机、oracle数据库服务器启动失败,myeclipse也变成龟速了,但是没办法,之前没有备份驱动,回不去了,那就只能再安装驱动了,这次直接到联想的官网上下载了电源管理驱动,安装过程中需要重启,结果我手贱点了确定,直接就关机了,myeclipse都没来得及正常关闭,再次开机之后,登录报空指针异常,看了半天也没看出来有什么错,第一次面对空指针异常错误束手无策,好吧,那就登录了,直接去index页面(这个时候登录过滤功能还没做),结果index页面所有需要连接oracle的功能全部报空指针异常,这下感觉到有点麻烦了,明天就要去给导师演示,怎么就突然出错了呢,没办法,只能先debug一下,看看什么情况?如下就是debug的结果
      从上图我们可以看出spring没有注入,但是我没动过spring配置文件啊,再说了仔细检查了一下也没看出来配置文件有什么错,

<!--配置sessionFactory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml">
        </property>
    </bean>
    
        <!-- 声明一个 Hibernate 3 的事务管理器供代理类自动管理事务用 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <!--配置事务传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
    <!-- 指明哪些类要使用事务 -->
    <aop:config>
        <aop:pointcut id="allmethod" expression="execution(* com.shiep.dao.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allmethod" />
    </aop:config>



    <!--把接口对象dao注入action中 -->
    <bean id="login" class="com.shiep.action.LoginAction">
        <property name="operatorDao" ref="operatorDao"></property>
    </bean>

    <!--声明接口对象dao -->
    <bean id="operatorDao" class="com.shiep.daoImpl.OperatorDaoImpl">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
action中
private OperatorDao operatorDao;
setter.....getter
        那就是jar包有问题了,于是重新导入了一下jar包,而且都复制到了工程的lib目录下,但是还是空指针;那就重新建一个工程,结果还是空指针;也许是tomcat有问题,那就重新找个纯净一点的tomcat,结果还是空指针;那就重新建个myeclipse的工作区间?结果还是空指针;要不把电脑重启一下?结果还是空指针;好吧,往窗外一下,奶奶的,天都亮了,看来给导师演示是不可能了,只能发个短信说明情况了,接下来,睡觉,熬了一夜,什么结果也没有,真郁闷,这个时候睡觉那叫一个秒睡,坑哥的是,睡觉还做梦也就算了,结果满脑子还是空指针的梦,真是噩梦啊,醒来都快中午了,外面下雨,直接泡面算了
         下午的时候又开始了征途,由于我之前有次在答辩剩一周的时候硬盘坏了,两周的代码都没了,在最后一周天天熬夜才勉强做完,所以自打这以后,关机之前都会把程序备份一份到优盘里,我想这样直接导入备份的工程应该不会错吧,但是。。。。还是空指针,这下我有点蒙了,怎么连以前好的程序都出问题了,于是我认为是myeclipse有问题了,那就果断重装,之后再运行,结果还是空指针,真的有点绝望了,能想到的法子都想过了,而且在网上的论坛上大家也没找出什么问题,点击打开链接,因为以前是好好的,只是在myeclipse没有正常关闭之后才出现的,所以坚信自己的代码没有问题,但是经历了这么多的尝试之后,开始有点怀疑自己的代码了,总感觉系统运行的时候没有加载spring,但是查看日志发现,spring加载成功,而且spring时时刻刻都在监视着dao对象,也就是需要注入的对象,我就纳闷了,为什么spring只监视,不注入呢,难道他缺乏注入的通道?也不可能吧,setter方法不就是吗?这个时候网上有些人说是jdk的版本问题,但是我的都一致啊;也有人说是类没有加载成功,重新编译一下,好吧,那就clean一下,结果myeclipse报错了,当时感觉有希望了,要知道这是出异常之后myeclipse第一次报错,如下
严重: Exception invoking periodic operation:
java.lang.NoClassDefFoundError: org/apache/struts2/util/ObjectFactoryDestroyable
    at org.apache.struts2.dispatcher.Dispatcher.cleanup(Dispatcher.java:254)
    at org.apache.struts2.dispatcher.FilterDispatcher.destroy(FilterDispatcher.java:233)
    at org.apache.catalina.core.ApplicationFilterConfig.release(ApplicationFilterConfig.java:332)
    at org.apache.catalina.core.StandardContext.filterStop(StandardContext.java:3731)
    at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4493)
    at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1097)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1203)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
    at java.lang.Thread.run(Thread.java:619)
      嗯,这是缺少jar包吗?但是网上关于这个异常的信息非常有限,没有找到有用的信息,因为把自己之前备份的程序拿出来重新编译了一下也是这个错,所以当时就赶紧这个错误不影响程序运行的,就没再去关注。
          这个时候就不得不考虑自己是不是进入了一个死胡同,有点当局者迷了,那就跳出目前的这个“局”,不管这个异常了,看看书,从最基础的SSH结合来看一遍,从hibernate与spring没看出什么,但是当看到struts和spring时,突然在书 的下面看到一行小字,显示的是注意,里面有个单词“ObjectFactory”,眼前一亮,联想到刚才重新编译的时候myeclipse报的那个错,赶紧看了一下完整的一段,是这样说的:“也可以不必在spring中去注册action,通常struts框架会自动从action mapping中创建action对象。则做如下配置:”
          配置struts.objectFactory属性值。在struts.properties中设置 struts.objectFactory属性值:struts.objectFactory = spring或者在XML文件中进行常量配置。
<struts>
    <constant name="struts.objectFactory" value = "spring"/>
</struts>
           这里设置struts.objectFactory的值为spring,实际上spring是StrutsSpringObjectFactory类的缩写,默认情况下所有由struts2框架创建的对象都是由ObjectFactory实例化的,ObjectFactory提供了与其他IOC容器,如spring、pico等集成的方法。
       spring插件是通过覆盖struts2的ObjectFactory来增强核心框架对象的创建,当创建一个对象的时候,它会用struts2配置文件的class属性去和spring配置文件中的ID属性去关联,如果能找到,则有spring创建,否则有struts2框架自己创建,然后由spring装配。

           看到了上面这些话的时候,我感觉有希望了,下载了一个struts-spring-plug包试了一下,但是struts和spring可以结合也可以不结合,而我之前就是没有结合,我想说的是,为什么我之前struts与spring没有半毛关系,好好的,项目快要完成的时候就突然所有的spring注入都失效?然后我又发现我只结合了登录的时候的struts和spring,但是现在居然其他没有结合的功能都运行的好好的,什么情况?越来越诡异了,然后我把登录时候的结合也去掉,就像程序崩溃之前一样,让struts与spring没有半毛关系,奇迹出现了,还是运行成功,天啊,有人能告诉我为什么吗?我感觉我不是在编程,而是在变魔术
         遇到这个问题的人在网上还不在少数,都是项目做到中途就发生了,我想这个问题估计是struts2和spring结合的时候有bug,必须用哪个插件来稳定,不然永远都是一颗定时炸弹,系统随时都可能崩溃,所以建议大家以后还是自己手动结合吧,自动结合不太可靠。而且这样时好时坏的样子,让人不太容易怀疑到代码问题,因此解决起来时间成本特别大
       整整一天一夜才搞定这个bug,代价太大了,所以得总结一下:第一:不要想当然,轻易放过有价值的异常;第二:适当的跳出当前的困境,从旁观者的角度看一下,会有意外的收获的;第三:没事的时候,多看看书,浏览一下与专业相关的知识,在专业知识方面多开阔一下自己的视野;第四:世上无难事只怕有心人。


你可能感兴趣的:(java,spring,struts,毕业设计)