Hi,
I'm trying to use Wink with JAXB objects generated from a schema with
inheritance.
In the schema, I have NodeType which is the parent of DataNodeType which is the
parent of ContainerNodeType and all of which are represented in XML as <node>
with the appropriate value of xsi:type, e.g., <node xsi:type="DataNodeType">.
I've generated JAXB objects from the schema with xjc.
Now in my service, I have a method which should take an XML node representation
from a HTTP PUT:
@Path("{nodeid}")
@PUT
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public JAXBElement<NodeType> putNode(@PathParam("nodeid") String nodeid,
NodeType node) {
System.out.println("Received node " + nodeid + " " + node.getClass());
ObjectFactory factory = new ObjectFactory();
return factory.createNode(node);
}
However, when I PUT a <node xsi:type="DataNodeType"> to the service, an object
of class NodeType is created instead of DataNodeType. If I change the method
signature to:
public JAXBElement<NodeType> putNode(@PathParam("nodeid") String nodeid,
DataNodeType node)
then it unmarshalls fine but I don't want to write a different method for each
specific different type of node.
I've also tried a ContextResolver defining a specific JAXBContent for the
package generated from the schema but this does not seem to do anything (even
though it is correctly registered and called).
I can always get the raw HTTPServletRequest object and do the unmarshalling
myself but that seems to defeat the purpose of using JAXB.
Any ideas?
Cheers,
Matthew