WebLogic上使用GWT / RequestFactory的ClassCastException

时间:2012-02-10 15:24:36

标签: gwt jpa weblogic eclipselink requestfactory

我正在客户端基于GWT / RequestFactory设置GWT应用程序,在服务器端基于WebLogic设置JPA / EclipseLink。

然而,在开发过程中,每次我在服务器端代码上更改某些内容(它可以是实体,DAO,甚至是Java文件中的注释!),我显然会在{2}之间得到ClassCastException当我尝试使用我的应用程序时类似的类,并且摆脱它的唯一方法是重新启动我的WebLogic服务器。即使重新部署应用程序也无济于事。

  

2012年2月10日下午4:08:10   com.google.web.bindery.requestfactory.server.RequestFactoryServlet   doPost SEVERE:意外错误java.lang.ClassCastException:   com.mycompany.MyClass无法强制转换为com.mycompany.MyClass at   com.mycompany.server.locator.CodeLevelLocator.getId(MyClassLocator.java:1)     在   com.google.web.bindery.requestfactory.server.LocatorServiceLayer.doGetId(LocatorServiceLayer.java:168)     在   com.google.web.bindery.requestfactory.server.LocatorServiceLayer.getId(LocatorServiceLayer.java:66)     在   com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.getId(ServiceLayerDecorator.java:81)

知道如何避免重启服务器吗?

感谢。

编辑:我正在为此设置一个赏金,因为在每次服务器更改后重新启动WebLogic真的很痛苦!!!

感谢James通过添加以下ServletContextListener解决了

EDIT2

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 个答案:

答案 0 :(得分:2)

这是一个类加载器问题,不管怎样,在重新部署之后,你的应用程序中仍然存在旧的类/实例。

它可能与JPA有关,您使用的是容器管理的持久性单元,还是应用程序管理的?管理的容器不应该有这个问题,但管理的应用程序可能就像你没有关闭旧的EntityManagerFactory一样,它可以保留旧的类。确保在重新部署之前关闭所有工厂,或者尝试容器管理以确定它是否能解决问题。

答案 1 :(得分:0)

不熟悉在Weblogic上运行GWT,但这可能会有所帮助。

以调试模式运行服务器 - 它应该能够在运行时获取类/ jar更改。

也许您只需要重新发布服务器而不是重新启动它。

最后,您是否在类路径中的其他位置的jar文件中拥有该类?