Исключение демаршалинга JAXB

РЕДАКТИРОВАНИЕ ВНИЗУ

В настоящее время возникают одна ошибка за другой. Кажется, я сделал шаг вперед и должен сделать 2 шага назад :) К сожалению, у меня нет никого локально, с кем я мог бы соединиться, поэтому большая часть моей отладки выполняется через Google и SO.

Я не очень хорошо знаком с jaxb и использую его для вызовов мыла (что я сейчас и пытаюсь сделать - подключиться к службе мыла), но мне сказали, что это самый простой подход к тому, что я хочу сделать и что я должен изучить это, так как я использую spring-boot в остальной части проекта, поэтому я нашел учебник (здесь) и начал там.

Вот раздел plugin моего pom, который создает пакет классов на основе wsdl:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.12.3</version>

    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>

    <configuration>
        <schemaLanguage>WSDL</schemaLanguage>
        <generatePackage>vantiveGenericWebService.wsdl</generatePackage>

        <schemas>
            <schema>
                <url>http://hostname:port/GenericWebService/ws?service=InstalledComponentService2&amp;appl=vantive&amp;wsdl</url>               
            </schema>
        </schemas>
    </configuration>
</plugin>

Я могу создавать классы wsdl в порядке.

Я создал клиентский класс:

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import vantiveGenericWebService.wsdl.GetICDetailsByAssetTag;
import vantiveGenericWebService.wsdl.GetICDetailsByAssetTagResponse;

@Component
public class VantiveGenericWebServiceClient extends WebServiceGatewaySupport {

    Logger log = Logger.getLogger(VantiveGenericWebServiceClient.class.getName());

    public GetICDetailsByAssetTagResponse getICDetailsByAssetTag(String assetTag) {
        GetICDetailsByAssetTag request = new GetICDetailsByAssetTag();
        request.setAssetTag(assetTag);

        log.info("Requesting asset tag for: " + assetTag);

        GetICDetailsByAssetTagResponse response = (GetICDetailsByAssetTagResponse) getWebServiceTemplate().marshalSendAndReceive("http://hostname:port/GenericWebService/ws?service=InstalledComponentService2&appl=vantive", request);

        return response;
    }
}

а также класс конфигурации клиента:

@Configuration
public class VantiveGenericWebServiceConfig {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("vantiveGenericWebService.wsdl");
        return marshaller;
    }

    @Bean
    public VantiveGenericWebServiceClient vantiveGenericWebServiceClient(Jaxb2Marshaller marshaller) {
        VantiveGenericWebServiceClient client = new VantiveGenericWebServiceClient();
        client.setDefaultUri("http://hostname:port/GenericWebService/ws?&service=InstalledComponentService2&appl=vantive");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);

//        ClientInterceptor[] interceptors = new ClientInterceptor[] { new ClientInterceptor() {
//            @Override
//            public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
//                return false;
//            }
//
//            @Override
//            public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
//                return true;
//            }
//
//            @Override
//            public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
//                return true;
//            }
//
//            @Override
//            public void afterCompletion(MessageContext messageContext, Exception e) throws WebServiceClientException {
//
//            }
//        }};

//        client.setInterceptors(interceptors);
        return client;
    }
}

Теперь об ошибке! Сначала я получил один, который выглядел так:

org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; nested exception is javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "vantiveGenericWebService.wsdl.GetICDetailsByAssetTag" as an element because it is missing an @XmlRootElement annotation]

поэтому я изменил класс GetICDetailsByAssetTag (класс, сгенерированный из wsdl), чтобы он выглядел следующим образом:

@XmlRootElement(name = "assetTag")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getICDetailsByAssetTag", propOrder = {
    "assetTag"
})
public class GetICDetailsByAssetTag {

который я не уверен на 100%, является правильным корнем xml, но ошибка исчезает. Теперь моя вторая (и текущая) ошибка такова:

org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault"). Expected elements are <{http://hostname/vantive/ws/InstalledComponentService2}DuplicateException>,<{http://hostname/vantive/ws/InstalledComponentService2}FunctionalException>,<{http://hostname/vantive/ws/InstalledComponentService2}GetICDetailsByAssetTagResponse>,<{http://hostname/vantive/ws/InstalledComponentService2}GetInstalledComponentDetailsByAssetTagAndStatusResponse>,<{http://hostname/vantive/ws/InstalledComponentService2}InvalidValuesException>,<{http://hostname/vantive/ws/InstalledComponentService2}SetClientDeviceXrefResponse>,<{http://hostname/vantive/ws/InstalledComponentService2}SetInstalledComponentAssetTagResponse>,<{http://hostname/vantive/ws/InstalledComponentService2}TechnicalException>,<{http://hostname/vantive/ws/InstalledComponentService2}assetTag>,<{http://hostname/vantive/ws/InstalledComponentService2}getICDetailsByAssetTag>,<{http://hostname/vantive/ws/InstalledComponentService2}getInstalledComponentDetailsByAssetTagAndStatus>,<{http://hostname/vantive/ws/InstalledComponentService2}installedComponentAssetTagDetails>,<{http://hostname/vantive/ws/InstalledComponentService2}installedComponentDetails>,<{http://hostname/vantive/ws/InstalledComponentService2}setClientDeviceXref>,<{http://com.savvis.it/vantive/ws/InstalledComponentService2}setClientDeviceXrefResult>,<{http://hostname/vantive/ws/InstalledComponentService2}setInstalledComponentAssetTag>,<{http://hostname/vantive/ws/InstalledComponentService2}setInstalledComponentAssetTagResult>

Я могу опубликовать полные трассировки стека, если это необходимо. Я опускаю прямо сейчас для пробела.

Поверьте мне, когда я говорю, что прошерстил Google и SO, просматривая все сообщения и предлагая ответы на эти ошибки (поэтому у меня в настоящее время закомментирован код перехватчика в моей конфигурации), и я просто не могу найти ничего, что 1. исправляет это и 2. объясняет, что именно я делаю неправильно. Я не очень забочусь о том, чтобы что-то работало, но я также не могу сказать вам, что происходит.

По совпадению, часть перехватчика делает так, что ошибка не выдается, но тогда мой ответ равен нулю.

У меня есть ощущение, что моя проблема будет простой, но, поскольку я впервые делаю что-то подобное, это просто не бросается мне в глаза. Прямо сейчас я просто хочу отправить свой запрос и получить действительный ответ, который я ожидаю, и я буду счастлив.

Для S&Gs, вот мое тело запроса на мыло (взято из SoapUI):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins="http://hostname/vantive/ws/InstalledComponentService2">
   <soapenv:Header/>
   <soapenv:Body>
      <ins:getICDetailsByAssetTag>
         <assetTag>asserTag</assetTag>
      </ins:getICDetailsByAssetTag>
   </soapenv:Body>
</soapenv:Envelope>

ИЗМЕНИТЬ После просмотра этого Я могу подтвердить, что мой класс ObjectFactory (который был создан с помощью wsdl) имеет методы создания, которые обернуты оболочкой JAXBElement, имеют @XmlElementDecl(namespace = "http://hostname/vantive/ws/InstalledComponentService2", xxx), а также теги имен, соответствующие классу, который обернутый оболочкой JAXBElement.

EDIT 2 Просто для ясности, вот мой класс package-info

@XmlSchema(namespace = "http://hostname/vantive/ws/InstalledComponentService2")
package vantiveGenericWebService.wsdl;

person user1818298    schedule 13.10.2016    source источник
comment
Прочтите этот пост в блоге, чтобы получить очень хорошее объяснение XmlRootElement: blog .bdoughan.com/2012/07/jaxb-and-root-elements.html   -  person Jonck van der Kogel    schedule 13.10.2016
comment
Эй, спасибо за ссылку @JonckvanderKogel! Это было много информации (хороший материал), и я на самом деле ушел с большим количеством вопросов, но я сохраню их для другой темы :) Одна быстрая вещь, которую я убрал, заключалась в том, что моя установка XmlRootElement в assetsTag может быть на самом деле правильным элементом ... на основе запроса на мыло.   -  person user1818298    schedule 13.10.2016