2011-11-30 55 views
1

我有一個.NET服務器託管一些Web服務。Java SOAP XML序列化錯誤

我在做一個Java客戶端。我使用Apache CFX根據給定的wsdl文件自動創建一些有用的類。

然而,當我做在Java中調用WebService的我得到以下錯誤:

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

提前感謝!

回答

2

我覺得CXF會生成一個採用JAXBElement而不是字符串的setter,這似乎很奇怪。可以在this answer中找到可能的解決方案,generateElementProperty屬性進一步記錄在WSIT Tutorial中。

您在這裏得到的異常是因爲您對QName使用了錯誤的構造函數,所以您應該指定元素的名稱空間URI和本地名稱作爲參數。