java - 在不同环境中转换 ElementNSImpl 的问题

标签 java spring casting marshalling unmarshalling

我正在构建一个 Java + Spring Web 客户端,它接收 XML 并将其解码为自动生成的类,基于我正在联系的服务提供的模式。

自动生成的代码包含一个返回 Element 对象的 getter。为了处理这个对象,我将其转换为 ElementNSImpl

public Element getThing() {
     return thing;
}

ElementNSImpl element = (ElementNSImpl) obj.getThing();
element.doSomething();

但是,我有两个可用的类 ElementNSImpl 源:

com.sun.org.apache.xerces.internal.dom.ElementNSImpl

org.apache.xerces.dom.ElementNSImpl

我还有两个环境(测试和生产)。 测试机运行CentOS Linux 7和OpenJDK 1.8.0_161。 生产机器运行 SUSE Linux Enterprise Server 11 SP4 和 Oracle JDK。

我遇到的问题是,当我在测试环境中运行代码时出现以下异常:

com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to org.apache.xerces.dom.ElementNSImpl

因此,我修改了我的类以导入 com.sun.org.apache.xerces.internal.dom.ElementNSImpl 而不是 org.apache.xerces.dom.ElementNSImpl 瞧,它开始工作了! 然后我将相同的 JAR 上传到生产环境,我得到了以下异常:

org.apache.xerces.dom.ElementNSImpl cannot be cast to com.sun.org.apache.xerces.internal.dom.ElementNSImpl

似乎每个程序都以不同的方式解码 XML,甚至认为这两个代码完全相同。

我还必须告知,所联系的测试服务器和生产服务器不同。他们应该是相同的并且行为方式相同(根据他们的支持团队)。仅适用于不同的数据库。

这个问题可能与我的申请有关吗?或者这可能与我从服务器获取的文件有关?可能是 OpenJDK 的问题吗?

最佳答案

正如@lexicore 所指出的,我不需要ElementNSImpl。只需将目标对象更改为 Element 并删除转换即可解决问题。

编辑:我仍然想了解那里发生了什么。

关于java - 在不同环境中转换 ElementNSImpl 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49263195/

相关文章:

c++ - 在签名和未签名之间进行转换

java - Spring idref 没有像我想象的那样工作

java - Spring webflux : keeping an EntityManager open during the whole process of a reactive request handling

java - 为什么要在 Java 中使用异常处理?

java - 添加 Android 库 : Only a type can be imported. com.project.test.networktasklibrary 解析为一个包

java - "classpath:"前缀是 Spring 特有的,还是 JVM 的概念?

Java:具有泛型方法的泛型类

java - 有没有办法避免 Java 的 awkard object cast 语法?

java - Jackson 将命名对象解析为同一个类

java - GWT html 文件国际化