【问题标题】:Java 5 Does not validate DTDJava 5 不验证 DTD
【发布时间】:2009-08-31 13:53:03
【问题描述】:

我正在使用供应商小程序,该小程序在 JRE 1.4.2_X 和 1.6.X 上运行良好,但在 1.5.X 的每个版本上都失败了。由于另一个应用程序冲突无法与 Java 6 配合使用,因此无法使用 1.6 运行。

我认为问题在于未验证 DTD。这会导致“未声明”问题和产生的空指针。

 Error: Fri Aug 28 11:21:29 EDT 2009 org.xml.sax.SAXParseException: 
 Element type "UserSessionList" is not declared.
 java.lang.NullPointerException

我尝试更改默认验证类,但问题仍然没有改变。

 -Djavax.xml.validation.SchemaFactory:http://relaxng.org/ns/structure
 /1.0=org.apache.xerces.jaxp.validation.XMLSchemaFactory

我可以为此使用其他验证吗?

我真的没有选择修改小程序的代码,该小程序已超出供应商的生命周期,因此不太可能获得他们的支持。因此,任何解决方法都不能涉及更改代码,因为我们不拥有它。

【问题讨论】:

  • 第 1 点:JDK 1.5 确实验证了 DTD;如果没有,我有一堆程序会失败。
  • 第 2 点:它说的元素类型没有声明这一事实强烈表明它实际上是针对 DTD 进行验证的,或者 XML 有一个不属于其中的元素该 DTD 或 DTD 内部不一致(尚未查看该错误消息的原因)。
  • 第 3 点:Sun JDK(我相信还有 JRockit)已经使用 Xerces。因此,除非您在 Xerces 发行版而不是 JDK 发行版中修复了特定错误,否则设置不同的验证器对您没有帮助。
  • 第 4 点:模式验证的处理方式与 DTD 验证不同。你用的是哪个?
  • 这不是我的代码,所以除非我开始反编译类,否则我不确定我是否能回答所有问题。我缺乏关于验证的深入知识。我无法弄清楚为什么这在 1.6 中可以正常工作,但在 1.5 中却失败了。我尝试在 1.5 中使用 1.6 认可的 jaxp jar,但我得到了同样的错误。由于这在 1.5 上是 100% 可重现的,我不认为它在 dtd 中没有的 xml 中出现了一些疯狂的事情,但由于某种原因,dtd 甚至没有被加载。有什么方法可以验证吗?如何判断我使用的是模式还是 dtd 验证?

标签: java validation applet dtd


【解决方案1】:

尝试将当前版本的 Xerces 放入类路径中,并去掉所有这些 -D。 Xerces 中的 SPI 将接管所有这些,并且可能会表现得更好。

【讨论】:

  • 我会尝试抓取 xml,我想我不记得在嗅探器日志中看到过它。我没想到真的会放松,我只是想让它做一些不同的事情。这个小程序在 1.5 上 100% 的时间都失败了。我主要是想弄清楚导致失败的 1.5 和 1.6 之间的差异是什么。当我得到它时会发布xml。将其复制为 poja 并不容易,因为我不拥有源代码,但可能使用 xml。
【解决方案2】:

您可以在未修改所有现有代码的情况下部署小程序,并指定它在哪个 Java 版本下执行。您可以通过在小程序中声明 classid 参数来做到这一点,如下所示:

<OBJECT
    classid="clsid:CAFEEFAC-0014-0002-FFFF-ABCDEFFEDCBA"
    width="200" height="200">
    <PARAM name="code" value="Applet1.class">
</OBJECT>

Java 的最后四个主要版本有不同的classids

1.3 使用 CAFEEFAC-0013-0001-FFFF-ABCDEFFEDCBA
1.4 使用 CAFEEFAC-0014-0002-FFFF-ABCDEFFEDCBA
1.5 使用 CAFEEFAC-0015-0000-FFFF-ABCDEFFEDCBA
1.6 使用 CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA

需要注意的是,客户端计算机必须安装该版本的 Java,但 JRE 仍可在 Sun 的网站上找到。更多信息在这里:http://java.sun.com/javase/6/webnotes/family-clsid.html

因此,您可以强制您的小程序仅运行 1.4,而最终用户是否安装了其他版本的 Java 并不重要,只要他们有 1.4 来运行您的小程序。

【讨论】:

  • 我理解你对classid的说法。但是,安装 1.5 后,它将拒绝在该系列之外运行 JRE。您可以进行注册表更改以关闭安全静态版本控制,但这会破坏客户端计算机上其他 3 个小程序中的 1 个。我可以加载 1.6,这将允许较旧的 JRE 在通过安全提示后运行,但 1.6 也会破坏其他小程序。如果我可以让它与 1.5 一起使用,我可以运行所有的小程序就好了。
【解决方案3】:

在与 Java 1.5 一起使用时,Xerces 中似乎存在错误。看这个Tomcat bug.的最后一条评论

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 2010-12-07
    • 2012-11-28
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多