2010-11-11 51 views
2

應用程序上下文Web上下文(以及類加載器問題)之間的分隔對我來說是一個常見的問題來源。我在第一個項目中使用Spring,從一個寫得很差的基於JSP的Web應用程序遷移到基於Spring的應用程序。Spring中的Application Context與Web Context有什麼關係?

我只是想知道,如果這個配置是有道理的:

  • 我有控制器,表單對象,而這種使用註釋定義,並在Web應用程序上下文掃描。
  • 我將DAO(數據訪問對象)最初放到Web應用程序上下文後移動到應用程序上下文中 - 這是因爲我需要使用它們來獲取spring安全性的用戶/密碼,這是一個應用程序上下文bean 。
  • 如果在應用程序上下文中定義了Spring安全性(按照文檔),必須使用DAO。

現在我運行到哪裏我傳遞一個對象到JDO/DataNucleus將類加載器問題,它是由Web應用程序的類加載器創建的,但DAO的是應用程序上下文的一部分,因此該組件都有自己的類加載器並不能匹配相同的對象。從DAO

簡單的方法:

@Override 
public boolean userExists(String username) { 
    Query query = pm.newQuery(User.class); 
    query.setFilter("username == :usernameParam"); 
    query.setResult("count(username)"); 
    query.setResultClass(Long.class); 
    System.out.println(username); 
    Long result = (Long)query.execute(username); 

    return (result!=null && result>0); 
} 

javax.jdo.JDOUserException:查詢 將返回一個單一的領域,但它是 不是一致的類型作爲 ResultClass(java.lang中。龍):這是 java.lang.Long中

我問,因爲這不是第一類加載器問題(我不擔心最後一個)流行,因爲這樣SPRIN達g現在配置好了,所以我想知道我是否做得不好。

或者也許有一些配置可以解決我尚未意識到的這些類加載器問題?

+0

您的術語令人困惑。 「應用程序上下文」和「網絡上下文」可以指代各種不同的東西,但是你正在使用它們就像它們指的是特定的東西。 – skaffman 2010-11-11 11:42:13

+0

謝謝skaffman,我會說我指的是Spring的應用上下文(Spring-mvc術語是一個跨web應用的上下文,在這個上下文中,所有webapps都可以訪問bean),以及WebApp上下文,這是一個上下文其中創建了特定於單個webapp的所有bean。我的意思是使用Spring術語中的術語。 – 2010-11-12 15:44:36

回答

3

類加載器應該與Spring上下文無關。 Web應用程序上下文是一個通常包含控制器和視圖解析器的彈簧容器。應用程序上下文包含dao's。 Web應用程序上下文將應用程序上下文作爲父項,以便它可以訪問dao和服務bean,而不是相反。但是,上下文都是同一個戰爭的一部分,應該由同一個類加載器加載。

看着你的例外,我認爲,它似乎與Spring沒有任何關係。

+0

還有另一個類似的問題在http://stackoverflow.com/questions/4013047/different-classloaders-cause-classcastexception-when-persisting-data-via-spring – lalit 2010-11-11 11:50:13

+0

好的,謝謝,我會挖更多。有時聽到我在學習新工具時沒有完全脫離基礎是有幫助的。有趣的是,我也發佈了另一個問題,但這是一個帶有持久性的類加載器問題。我認爲這將是一個類加載器問題,所以我應該在這裏檢查哪個類加載器啓動了這兩個對象中的每一個。 – 2010-11-12 15:45:37

相關問題