Ошибка Java-сериализации XML SOAP - PullRequest
1 голос
/ 30 ноября 2011

У меня есть сервер .net, на котором размещены некоторые веб-сервисы.

Я делаю Java-клиент. Я использовал Apache CFX для автоматического создания некоторых полезных классов на основе данного файла wsdl.

Однако, когда я делаю вызов на Java веб-службе, я получаю следующую ошибку:

Exception in thread "Thread-3" javax.xml.ws.soap.SOAPFaultException: The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://localhost/MyService:ManualAddress. The InnerException message was 'There was an error deserializing the object of type Company.Product.Application.Services.DataContracts.LetterProcessManualAddress. The '/' character, hexadecimal value 0x2F, cannot be included in a name. Line 1, position 2119.'.  Please see InnerException for more details.
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(Unknown Source)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)
at $Proxy37.processEnrollmentTraditionalDeficiency(Unknown Source)
at com.parc.peimage.PEFormViewer$3.run(PEFormViewer.java:2582)
at java.lang.Thread.run(Unknown Source)

Ручной адрес является элементом JAXBElement, и мой XML не создается должным образом из-за этой ошибки.

Это мой код для создания адреса:

// SET manual address variables
com.parc.SomeCompanyAPI.Address MA;
MA = new Address();
MA.setAddressInCareOfName(new JAXBElement <String>  (new QName("http://example.com/SampleService"), String.class, "MyName"));
MA.setAddressLineOne(new JAXBElement <String>  (new QName("http://example.com/SampleService"), String.class, "MyAdd1"));
MA.setAddressLineTwo(new JAXBElement <String> (new QName("http://example.com/SampleService"), String.class, "MyAdd2"));
MA.setCity(new JAXBElement <String> (new QName("http://example.com/SampleService"), String.class, "MyAdd3"));
MA.setStateCode(new JAXBElement <String> (new QName("http://example.com/SampleService"), String.class, "MyAdd4"));
MA.setZipCode(new JAXBElement <String> (new QName("http://example.com/SampleService"), String.class, "MyAdd5"));
JAXBElement <Address> majax = new JAXBElement <Address> (new QName("http://example.com/SampleService"), Address.class, MA);
letter.setAddress(majax);
JAXBElement <String> provider = new JAXBElement<String>(new QName("http://example.com/SampleService"), String.class, "bob");
letter.setProviderName(provider);

Заранее спасибо!

1 Ответ

2 голосов
/ 30 ноября 2011

Мне кажется странным, что CXF генерирует сеттеры, принимающие JAXBElement вместо строки. Возможное решение этой проблемы можно найти в этом ответе , атрибут generateElementProperty дополнительно задокументирован в WSIT Tutorial .

Исключением, которое вы получаете здесь, является то, что вы используете неправильный конструктор для QName , вы должны указать в качестве параметров URI пространства имен и локальное имя элемента.

...