从Intellij IDEA运行Tomcat时的差异?

时间:2011-04-11 16:38:31

标签: java serialization tomcat intellij-idea spring-webflow

我在Tomcat(6.0.32)中运行的Spring 3.5,Webflow 2.2应用程序存在一个非常奇怪的问题

部分Webflow调用以检索对象列表。此列表放在viewScope对象中以供JSP视图使用。此列表中的每个对象都继承自包含一些公共字段的基类。

然后,Webflow通过写出所有对象,转发到显示此列表内容的JSP视图。

当我从一个独立的Tomcat运行它时,基类上的字段都以某种方式设置为null。我已经调试并确认列表是从Webflow调用的代码中正确构建的。因此,在将列表放入Webflow视图范围,然后由JSP检索之间,将基类字段重置为null。

问题的真正奇怪之处在于,如果我从Intellij IDEA中启动并运行Tomcat,应用程序将完美运行。我尝试过各种JDK和Tomcat版本,但都有同样的问题。

这似乎是一个Webflow问题(可能不正确的序列化?),这对Tomcat是否从IntelliJ中启动很敏感。

IntelliJ的做法是什么导致Java序列化行为不当?

2 个答案:

答案 0 :(得分:4)

好吧,我没有找到确切的根本原因,但我确实有一个解决方法。我简单地实现了自定义对象序列化方法 - private void writeObject()和readObject() - 对于神秘地未正确序列化的对象,一切都开始工作了。基类中只有几种简单类型(一对long和一个String),所以它并不复杂。

只是为了澄清(如果有任何一个是interessted) - 我的网络应用程序中有一个表单使用的数据对象。此对象包含属性对象的映射,其中每个属性对象都基于类层次结构,如下所示:

属性类 - >共享基类 - >根基类

所有这些数据都通过Spring web-flow持久保存到字节数组中,然后在web-flow调用视图时取消持久化。在我的例子中,默认机制没有保留根基类的字段。

我仍然不确切地知道为什么。我仍然不知道为什么,当我从IntelliJ中启动Tomcat时,序列化按预期工作。很奇怪。


更新:找到了罪魁祸首。一个非常糟糕的Ant构建脚本,隐藏了一个缺少“可序列化”的界面标记。

有问题的系统实际上非常庞大,并且有一个讨厌的,难以理解的Ant构建脚本。我以为它正在做一个完整,适当的清洁构建。在上面显示的类层次结构中,Attribute类和Root Base Class位于不同的jar中。并且包含根基类的jar实际上正在被缓存而不能正确重建。

正在部署的基类的较旧(不正确)版本没有“可序列化”标记接口(Attribute类确实)。当然,它的字段没有被序列化。当我在IntelliJ中进行测试时,它正在直接从我的源代码进行构建和部署。

我现在感觉真的很蠢。

答案 1 :(得分:1)

当我使用IDE构建WAR时,我已经看到了各种IDE的这种现象,并且当在IDE中运行时,它使用的是与在IDE外部运行时不同的缓存类。要缩小现象范围,请尝试以下方法:

如果您还没有,请为您的项目创建Ant或Maven构建。清理所有.class文件和其他工件,关闭intellij,使用Ant或Maven构建WAR,并尝试将其部署到Tomcat。看看你是否有奇怪的行为。

接下来,尝试在Intellij中启动Tomcat服务器,但不要在Intellij中部署应用程序。通过将war放入文件系统上的Intellij Tomcat实例,将应用程序部署到外部。

最后,不要从Intellij中启动Tomcat,而是从外部启动它并使用远程调试连接到它,然后查看问题是否发生。有关如何配置远程调试的信息,请参阅以下内容:http://wiki.apache.org/tomcat/FAQ/Developing