在不同环境中抛出ElementNSImpl的问题

时间:2018-03-13 18:17:07

标签: 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有关吗?

2 个答案:

答案 0 :(得分:4)

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

编辑:我仍然想了解那里发生的事情。

答案 1 :(得分:1)

我在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>

以及在我必须获得答案数量的班级中:

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();