I want to build a REST java backend (using jersey) for an existing JavaScript library (SmartClient). This JavaScript library sends requests in different format to my server.
How can I deserialize an XML to a container object, that contains different types of content?
Here is an example, with what I already tried:
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Box {
static class Ball {
public String size;
public String toString() {return "Ball(" + size + ")";}
}
static class Cat {
public String name;
public String toString() {return "Cat(" + name + ")";}
}
public static void main(String[] args) throws Exception {
printContent("<box><content><size>3</size></content></box>");
printContent("<box><content><name>Mimi</name></content></box>");
}
private static void printContent(String xml) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(Box.class, Ball.class, Cat.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Box box = (Box) unmarshaller.unmarshal(new StringReader(xml));
System.out.println(box.content);
}
// not working
public Object content;
// not working
// @XmlMixed
// public Object content;
// not working
// @XmlAnyElement
// public List<Object> content;
// not working
// @XmlAnyElement(lax=true)
// public List<Object> content;
// not working
// @XmlJavaTypeAdapter(ContentXmlAdapter.class)
// public Object content;
// static class ContentXmlAdapter extends XmlAdapter<String, Object>{
//
// @Override
// public Object unmarshal(String v) throws Exception {
// System.out.println("unmarshal("+v+")");
// return null;
// }
//
// public String marshal(Object v) throws Exception {throw new UnsupportedOperationException();}
// }
}