Spring學習筆記系列(五) 與hibernate整合 b

          常見問題及解決方案

          現象1:
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.support.DefaultPointcutAdvisor' defined in null: Can't resolve reference to bean 'txAdvice' while setting property 'advice'; nested exception is

          原因:缺少Spring開頭的各種包,到Spring2.0 src中編譯新的dist目錄出來,拷貝全部的springxxx.jar到jpetstore/WEB-INF/lib下。OK。

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          現象2:
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
          java.lang.NoClassDefFoundError: javax/transaction/TransactionManager


          原因:缺少jta.jar,OK

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          現象3:

          java.lang.NoClassDefFoundError: org/dom4j/Attribute
          缺dom4j.jar
          java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException
          缺ehcache.jar
          java.lang.NoClassDefFoundError: net/sf/cglib/core/KeyFactory
          缺cglib-full.jar

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          現象4:
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Initialization of bean failed; nested exception is net.sf.hibernate.MappingException: could not instantiate id generator
          net.sf.hibernate.MappingException: could not instantiate id generator

          原因:
          hbm中id字段的定義為沒有定義的sequesce,修改為inc
          <id
             name="id"
             type="string"
             column="userid"
            >
             <generator class="net.sf.hibernate.id.IncrementGenerator"/> // 原來是sequence.
            </id>
          這樣就可以了。

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          現象6:
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/shop/addItemToCart.do' defined in ServletContext resource [/WEB-INF/petstore-servlet.xml]: Can't resolve reference to bean 'petStore' while setting property 'petStore'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'petStore' is defined
          org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'petStore' is defined
          原因:
          我使用Struts作為action,當然就不需要使用Spring WEB framework,因此也不需要與之配套的配置文件例如,petstore-servlet.xml,
          還有remote-servlet.xml ,但是Spring仍舊加載此兩個文件,沒辦法,只好將此兩個文件挪動到別的地方,但是又出現找不到這兩個
          文件的IO異常,沒辦法,只好又拷貝回來,然后把文件內容晴空。
          終于好用了。
          原 因就是,只要你在web.xml中定義了這個servlet,他就要去找此servlet名字對應的配置文件(servletname- servlet.xml),找不到就出錯。ok,現在注釋掉web.xml中名字為petstore的servlet定義和影色,刪除petstore- servlet.xml文件,哈哈,這下不報告錯誤了。
          同理,注釋名字為remote的servlet,刪除remote-servlet.xml后,重新啟動tomcat,這下不報告任何錯誤了。呵呵。原來如此啊。

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          現象:
          java.lang.NullPointerException
           srx.test.testhibernate.UserDAO.getAll(UserDAO.java:9)
           srx.test.struts.action.UserAction.execute(UserAction.java:20)
          原因:

          Action原來
          UserDAO // 這個類OK
          public class UserDAO extends HibernateDaoSupport {
           public List getAll() {
                 return this.getHibernateTemplate().find("select aa from Account aa");
           }
          }

          //這個類需要修改
          public class UserAction extends ActionSupport {
            UserDAO dao = new UserDAO();
            List accounts = dao.getAll();
          。。。
          }
          修改:
          //UserDAO dao = new UserDAO();
          WebApplicationContext wac = this.getWebApplicationContext();
            UserDAO dao = (UserDAO) wac.getBean("userDAO");
          OK


          現象:
          UserAction中修改:
          //UserDAO dao = (UserDAO) wac.getBean("userDAO");
          UserDAO dao = (UserDAO) wac.getBean("userDAOProxy"); //@1
          配置文件中增加:
          <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager">
             <ref local="transactionManager"/>
            </property>
            <property name="target"><ref local="userDAO"/></property>
            <property name="transactionAttributes">
             <props>
              <prop key="insert*">PROPAGATION_REQUIRED</prop>
              <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
             </props>
            </property>
          </bean>

          這樣運行時@1處拋出ClassCastException.
          ===================================================================================================
          原因:
          仔細看指南0.8版本145頁所描述的事情.UserDAO雖然只繼承了HibernateDAOSupport,看來沒有事先任何接口,但是
          HibernateDAOSupport實現了InitiralBean接口,所以UserDAO也相當于實現了這個接口。
          因此本例按照實現了某個接口的DAO來處理,處理過程如下:
           因為他實現了接口A,所以getBean得到一個實現了A的實例,并非繼承UserDAO。所以用UserDAO轉型會失敗。
           如果UserDAO沒有實現接口A,那么getBean會得到一個UserDAO的子類實例,這時可以用UserDAO來轉型。
          綜上所訴,UserDAO必須實現IUserDAO接口,并且用IUserDAO轉型才行.
           因為UserDAO必須繼承HibernateDAOSupport,所以沒有辦法不實現任何接口.

          本問題和AOP有關。因為對AOP還不熟悉,所以需要看看。



          posted on 2007-06-18 18:02 chenguo 閱讀(241) 評論(0)  編輯  收藏 所屬分類: Spring Dev

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          留言簿

          隨筆分類(1)

          文章分類(52)

          好友 小山的博客

          最新隨筆

          最新評論

          主站蜘蛛池模板: 莱西市| 油尖旺区| 广平县| 中宁县| 交口县| 台山市| 大安市| 金沙县| 特克斯县| 奉节县| 平邑县| 咸丰县| 丹棱县| 北川| 龙井市| 桦南县| 庄河市| 延寿县| 家居| 龙州县| 清丰县| 绥棱县| 凌海市| 永年县| 丹寨县| 江都市| 杭锦旗| 甘南县| 凌云县| 罗源县| 文安县| 南丹县| 五寨县| 永丰县| 曲松县| 乐东| 衡水市| 家居| 金湖县| 光泽县| 奉贤区|