РЕДАКТИРОВАНИЕ ВНИЗУ
В настоящее время возникают одна ошибка за другой. Кажется, я сделал шаг вперед и должен сделать 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&appl=vantive&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;