ошибка в сортировке — ошибка аннотации отсутствующего элемента xmlrootelement

#spring-boot #jaxb #marshalling #xmlroot

#весенняя загрузка #jaxb #сортировка #xmlroot

Вопрос:

Когда я вызываю одну из операций 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 (уже используемых многими клиентами) как часть проекта spring —

         <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 в ошибке запроса
пришлось передать функцию WebServiceMessageCallback, как показано ниже, для установки SOAPAction

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");
                    }
                }));        
 

Комментарии:

1. Возможно, лучше использовать методы в классе ObjectFactory вместо use new JAXBElement<ABC>(new QName(uri, localpart),ABC.class,request) , таким образом, вы не ограничиваете свой код пространствами имен schemas и URI, если они изменены. Что-то вроде этого: ObjectFactory of = new ObjectFactory(); ABC vabc = of.createABC(); **populate vabc object** and then JAXBElement<ABC> jabc = of.createABC(vabc);