Ошибка маршаллинга - отсутствует аннотация xmlrootelement
Когда я вызываю одну из операций WSDL из весеннего проекта, я получаю следующее исключение - com.sun.istack.internal.SAXException2: unable to marshal type "com.pkg.wsdl.ABC" as an element because it is missing an @XmlRootElement annotation
Я использую следующие в pom.xml для генерации Java-объектов из WSDL(уже используется многими клиентами) как часть весеннего проекта -
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.1</version>
Глядя на аналогичное решение проблемы, я изменил код для использования JAXBElement, но все еще получаю ту же ошибку -
ABC vabc = new ABC();
vabc.set(..) // populate vabc object
ObjectFactory of = new ObjectFactory();
JAXBElement<ABC> jabc = of.createABC(vabc);
ABC oabc = jabc .getValue();
Код маршаллера -
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.pkg.wsdl");
и вызов серверной веб-службы -
ABCResp response = (ABCResp) getWebServiceTemplate()
.marshalSendAndReceive("http://host:port/svcname",oabc);
1 ответ
Были следующие проблемы, которые мне пришлось решить -
1 - отсутствует ошибка аннотации xmlRootElement
пришлось передать сам JAXBElement в marshalSendAndReceive, как показано ниже.
Вы можете получить точные детали из ObjectFactory для QName.
2 - пропущено soapAction в ошибке запроса
для установки soapAction пришлось передать функцию WebServiceMessageCallback, как показано ниже
3- classCastExcetion отменяет ответ
пришлось добавить JAXBIntrospector, чтобы исправить эту ошибку
ABCResp response = (ABCResp ) JAXBIntrospector.getValue(getWebServiceTemplate()
.marshalSendAndReceive(
"http://host:port/svcname",
new JAXBElement<ABC>(new QName(uri, localpart),ABC.class,request),
new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
((SoapMessage)message).setSoapAction("/test");
}
}));