2012-02-10 28 views
2

我正在基於客戶端上的GWT/RequestFactory以及服務器端上的WebLogic上的JPA/EclipseLink設置GWT應用程序。但是,在開發過程中,每次我在服務器端代碼(它可以是一個實體,DAO,甚至是Java文件中的註釋!)都改變一些東西時,我在兩個明顯相似的類之間得到ClassCastException我嘗試使用我的應用程序,擺脫它的唯一方法是重新啓動WebLogic服務器。即使重新部署應用程序也無濟於事。在WebLogic上使用GWT/RequestFactory的ClassCastException

2012年2月10日下午4時08分10秒 com.google.web.bindery.requestfactory.server.RequestFactoryServlet 的doPost嚴重:意外的錯誤java.lang.ClassCastException: com.mycompany.MyClass不能轉換爲com.mycompany.MyClass在 com.mycompany.server.locator.CodeLevelLocator.getId(MyClassLocator.java:1) 在 com.google.web.bindery.requestfactory.server.LocatorServiceLayer.doGetId(LocatorServiceLayer.java: 168) at com.google.web.bindery.requestfactory.server.LocatorServiceLayer.getId(LocatorServiceLayer.java:66) at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.getId(ServiceLayerDecorator.java:81)

任何想法如何避免這種服務器重啓?

謝謝。

編輯:我正在設置一個賞金,因爲在每次服務器更換後重新啓動WebLogic真的很痛苦!

EDIT2解決由於詹姆斯通過添加以下的ServletContextListener:

public class DeploymentListener implements ServletContextListener { 

    private static Logger log = LoggerFactory 
      .getLogger(DeploymentListener.class.getName()); 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 

     try { 
      // close the Entity Manager Factory. 
      EMF.close(); 
     } catch (Exception e) { 
      log.error("Error closing the Entity Manager Factory", e); 
     } 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     // nothing to do 
    } 

} 
+2

我沒有真正的答案,但我可以這樣建議:​​錯誤看起來像一個類加載器問題,其中jvm顯然對來自兩個類加載器的同一類有兩個不同的聲明,因此認爲它們是不同的類。大多數servlet容器使用專門的類加載器來保持應用程序與其他應用程序的隔離,並允許重新部署應用程序 - 我的猜測是,在您的情況下這不能正常工作。 – 2012-02-10 19:05:46

+0

感謝提示,但在這裏我相信[GWT/RequestFactory](http://code.google.com/webtoolkit/doc/latest/DevGuideRequestFactory.html)中有一些特定的內容。也許GWT的任何用戶都遇到過這個問題? – foch 2012-02-13 13:12:39

+0

我其實是一個GWT開發人員,並且在我的大部分項目中都使用RF,但我知道類加載程序問題足以提供該建議。在將RF類重新部署到Jetty或Tomcat時,我從未看到過這個問題。 – 2012-02-13 14:14:44

回答

2

這是一個類加載器問題,在重新部署之後,您將舊的類/實例保留在應用程序中的某處。

它可能與JPA相關,您使用容器管理的持久性單元還是應用程序管理?託管容器不應該有這個問題,但管理的應用程序可以,因爲如果你不關閉舊的EntityManagerFactory它可以留在舊的類。確保在重新部署之前關閉所有工廠,或嘗試通過設置容器來查看是否可以解決問題。

+0

太棒了,它的工作原理!我正在使用應用程序管理持久性,所以我添加了一個偵聽器來關閉我的工廠。這是花了50個代表,謝謝:) – foch 2012-02-28 16:48:54

0

不熟悉Weblogic上運行的GWT但也許這將幫助。

在調試模式下運行你的服務器 - 它應該能夠在運行時選擇類/ jar的變化。

也許你只需要重新發布你的服務器而不是重新啓動它。

最後,你的類路徑中的其他地方是否有一個jar文件?