Tim Goodman
Tim Goodman

Reputation: 23976

Why is JAXB generating the wrong XML for my WCF service?

I have a WCF service that expects an object which I'll call StuffContainer. Our client is trying to generate an XML-serialized StuffContainer using JAXB, but it's coming out wrong. They're ending up with type names where they should have property names, so we're not able to deserialize it.

I know nothing about JAXB, but I gather it creates some auto-generated classes based on our XSD, which can be used to build the XML-serialized object.

Here's the relevant snippet of our auto-generated XSD:

<xs:complexType name="StuffContainer">
    <xs:sequence>
        <xs:element minOccurs="0" name="myStuff" nillable="true" type="tns:ArrayOfStuff"/>
    </xs:sequence>
</xs:complexType>
...
<xs:complexType name="ArrayOfStuff">
    <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="Stuff" nillable="true" type="tns:Stuff"/>
    </xs:sequence>
</xs:complexType>

Our client's code looks something like this:

ObjectFactory objectFactory = new ObjectFactory();

ArrayOfStuff arrayOfStuff = objectFactory.createArrayOfStuff();
JAXBElement<ArrayOfStuff> arrayOfStuffJAXBElement = objectFactory.createArrayOfStuff(arrayOfStuff);

StuffContainer stuffContainer = objectFactory.createStuffContainer();
stuffContainer.setStuff(arrayOfStuffJAXBElement);

Here's the XML they're getting:

<StuffContainer xmlns="..."><ArrayOfStuff>...</ArrayOfStuff></StuffContainer>

But I need it to be:

<StuffContainer xmlns="..."><myStuff>...</myStuff></StuffContainer>

I think this is because the JAXBElement<ArrayOfStuff> that they're getting from the objectFactory has its QName set to "ArrayOfStuff", and this ends up getting used instead of the property name myStuff. But like I said I know nothing about JAXB so I'm not sure what they should be doing differently.

Is there something either that I can change in the XSD, or that I can ask our client to change in their code, so that it generates the correct XML?

Upvotes: 2

Views: 649

Answers (1)

bdoughan
bdoughan

Reputation: 149047

There may be multiple methods on the generated ObjectFactory class. The ones corresponding to nested elements have an entire path built into the method name.

Upvotes: 2

Related Questions