java - 从 Intellij IDEA 中运行 Tomcat 时有何不同?

标签 java serialization tomcat intellij-idea spring-webflow

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

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

然后,Webflow 将转发到一个 JSP View ,该 View 通过写出所有对象来显示此列表的内容。

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

问题中真正奇怪的部分是,如果我从 Intellij IDEA 中启动并运行 Tomcat,则该应用程序可以完美运行。我尝试了各种 JDK 和 Tomcat 版本,都有相同的问题。

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

IntelliJ 正在做什么可能导致 Java 序列化行为异常?

最佳答案

嗯,我还没有找到确切的根本原因,但我确实有一个解决方法。我只是在神秘地未正确序列化的对象上实现了自定义对象序列化方法 - private void writeObject() 和 readObject(),然后一切就开始工作了。基类中只有几个简单类型(几个 long 和一个 String),因此并不复杂。

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

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

所有这些数据都由 Spring Web-flow 保存到字节数组中,然后在 Web-flow 调用 View 时取消保存。就我而言,默认机制并未保留根基类的字段。

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


更新:找到罪魁祸首。一个非常糟糕的 Ant 构建脚本,隐藏了缺失的“可序列化”接口(interface)标记。

所涉及的系统实际上相当大,并且有一个令人讨厌的、难以理解的 Ant 构建脚本。我以为它正在做一个完整的、正确的、干净的构建。在我上面显示的类层次结构中,属性类和根基类位于不同的 jar 中。包含根基类的 jar 实际上被缓存并且没有正确重建。

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

我现在感觉自己真的很傻。

关于java - 从 Intellij IDEA 中运行 Tomcat 时有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5624565/

相关文章:

java - Mockito 通过泛型类型的构造函数参数反射创建模拟

java - Java中删除LinkedList中的节点

java - 在android中打开SQLite数据库文件

android - 将多个参数放入 ContentResolver.requestSync

c# - 如何将 XML 集合反序列化为 .NET 中的字典?

java - chrome 不允许 localhost 来源

java - 在 Jelastic 环境中保护 Tomcat 节点

java - 获取同一页面内容的标签

security - tomcat 中是否存在对接受盐的 JDBCRealm 的支持?

c# - 改变 xml 序列化的输出