2016-10-15 4 views
2

Когда я называю один из операции WSDL из пружинного проекта, я получаю следующее исключение - com.sun.istack.internal.SAXException2: unable to marshal type "com.pkg.wsdl.ABC" as an element because it is missing an @XmlRootElement annotationошибка в сортировочном - отсутствует xmlrootelement ошибка аннотации

Я использую следующий в 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"); 

и Вызов бэкенд Web Service -

 ABCResp response = (ABCResp) getWebServiceTemplate() 
     .marshalSendAndReceive("http://host:port/svcname",oabc); 

ответ

5

Имел следующие вопросы, которые я должен был решить -
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"); 
        } 
       }));   
+0

Возможно, лучше использовать методы в классе ObjectFactory вместо использования 'new JAXBElement (новое QName (uri, localpart), ABC.class, request) ', таким образом, вы не затягиваете свой код с пространствами имен схем и URI, если они изменены. Что-то вроде этого: 'ObjectFactory of = new ObjectFactory(); ABC vabc = of.createABC(); ** заполнить объект vabc **, а затем JAXBElement jabc = of.createABC (vabc); ' –