Я создаю веб-клиент Java + Spring, который получает XML и распаковывает его в автоматически сгенерированные классы на основе схемы, предоставленной службой, с которой я связываюсь.

Автоматически сгенерированный код содержит метод получения, который возвращает объект Element. Чтобы обработать этот объект, я использовал его как 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?

3
Lucas 13 Мар 2018 в 21:17

2 ответа

Лучший ответ

Как заметил @lexicore, мне не нужен ElementNSImpl. Простое изменение целевого объекта на Element и удаление приведения решило проблему.

РЕДАКТИРОВАТЬ: Я все еще хотел бы понять, что там произошло.

6
Lucas 4 Июл 2018 в 18:58

У меня была аналогичная проблема с ответом 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();
1
jruano 24 Окт 2018 в 11:11