ClassCastException with GWT/RequestFactory on WebLogic



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

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

2012年2月10日下午4:08:10com.google.web.bindery.requestfactory.server.RequestFactoryServletdoPost SEVERE:意外错误java.lang.ClassCastException:com.mycompany.MyClass无法强制转换为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(ServiceLayerDecurator.java:81)

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

谢谢。

EDIT:我正在为此设置奖励,因为每次服务器更改后重新启动WebLogic真的很痛苦!!!

EDIT2由于James添加了以下Servlet上下文侦听器而得以解决:

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
    }
}

这是一个类加载器问题,在重新部署后,旧的类/实例仍保留在应用程序中。

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

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

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

也许你只需要重新发布你的服务器,而不是重新启动它

最后,在类路径的其他地方,jar文件中是否有该类?

最新更新