在不同环境中投射 ElementNSImpl 的问题
Issues casting ElementNSImpl in different environments
我正在构建一个 Java + Spring 网络客户端,它接收 XML 并根据提供的模式将其解组为自动生成的 classes通过我正在联系的服务。
自动生成的代码包含一个 getter 和 returns 一个 Element
对象。为了处理这个对象,我将其转换为 ElementNSImpl
.
public Element getThing() {
return thing;
}
ElementNSImpl element = (ElementNSImpl) obj.getThing();
element.doSomething();
但是,我有两个可用的来源 class ElementNSImpl
:
com.sun.org.apache.xerces.internal.dom.ElementNSImpl
和
org.apache.xerces.dom.ElementNSImpl
我也有两个环境(测试和生产)。
测试机运行CentOSLinux7和OpenJDK1.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
因此,我修改了 class 以导入 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
并删除强制转换即可解决问题。
编辑:我仍然想了解那里发生了什么。
我在 SOAP 响应中遇到了类似的问题,我通过导入以下 maven 库解决了它
<! - https://mvnrepository.com/artifact/com.sun.org.apache/jaxp-ri ->
<dependency>
<groupId>com.sun.org.apache</groupId>
<artifactId>jaxp-ri</artifactId>
<version>1.4</version>
</dependency>
并且在 class 我必须收到答案的地方:
import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
import com.sun.org.apache.xerces.internal.dom.ElementNSImpl;
并按以下方式进行转换
SERVICEDISPATCHERRESPONSE response;
DocumentImpl document = (DocumentImpl) ((ElementNSImpl) response.getAny()).GetOwnerDocument();
我正在构建一个 Java + Spring 网络客户端,它接收 XML 并根据提供的模式将其解组为自动生成的 classes通过我正在联系的服务。
自动生成的代码包含一个 getter 和 returns 一个 Element
对象。为了处理这个对象,我将其转换为 ElementNSImpl
.
public Element getThing() {
return thing;
}
ElementNSImpl element = (ElementNSImpl) obj.getThing();
element.doSomething();
但是,我有两个可用的来源 class ElementNSImpl
:
com.sun.org.apache.xerces.internal.dom.ElementNSImpl
和
org.apache.xerces.dom.ElementNSImpl
我也有两个环境(测试和生产)。 测试机运行CentOSLinux7和OpenJDK1.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
因此,我修改了 class 以导入 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
并删除强制转换即可解决问题。
编辑:我仍然想了解那里发生了什么。
我在 SOAP 响应中遇到了类似的问题,我通过导入以下 maven 库解决了它
<! - https://mvnrepository.com/artifact/com.sun.org.apache/jaxp-ri ->
<dependency>
<groupId>com.sun.org.apache</groupId>
<artifactId>jaxp-ri</artifactId>
<version>1.4</version>
</dependency>
并且在 class 我必须收到答案的地方:
import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
import com.sun.org.apache.xerces.internal.dom.ElementNSImpl;
并按以下方式进行转换
SERVICEDISPATCHERRESPONSE response;
DocumentImpl document = (DocumentImpl) ((ElementNSImpl) response.getAny()).GetOwnerDocument();