Pregunta

Tengo un servidor .NET que aloja algunos servicios web.

Estoy haciendo un cliente Java. Utilicé Apache CFX para autocreatar algunas clases útiles basadas en el archivo WSDL dado.

Sin embargo, cuando hago la llamada en Java al servicio web, recibo el siguiente error:

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)

La dirección manual es un JaxBelement, y mi XML no se está creando correctamente debido a este error.

Este es mi código para crear la dirección:

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

¡Gracias por adelantado!

¿Fue útil?

Solución

Me parece extraño que CXF genere setters tomando un JAXBElement en lugar de una cadena. Una posible solución a eso se puede encontrar en esta respuesta, la generateElementProperty El atributo se documenta más en un Tutorial WSIT.

La excepción que está recibiendo aquí es porque está utilizando el constructor incorrecto para Qname, debe especificar tanto el URI del espacio de nombres como el nombre local del elemento como parámetros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top