Я пытаюсь unmarshall Xml возвращен из остального вызова в POJO. Однако один вызов может возвращать различные типы документов с различными корневыми элементами, например.Jaxb unmarshall в зависимости от корневого элемента
<obj1> ... </obj1>
<obj2> ... </obj2>
Я распаковать с помощью обобщенной функции:
private <T> T unmarshal(String xml, Class<T> clazz) {
JAXBContext jc = JAXBContext.newInstance(clazz);
return clazz.cast(jc.createUnmarshaller().unmarshal(new StringReader(xml));
}
Я создал для отдельных классов для каждого из различных корней, но я не знаю, как я могу проверить тип корневого элемента и затем вызовите функцию unmarshall с правильным типом?
if rootElement.equals("obj1")
Obj1 obj = unmarshal(xml, Obj1.class)
else if rootElement.equals("obj2")
Obj2 obj = unmarshal(xml, Obj2.class)
Есть ли способ использовать JaxB для выполнения этой условной проверки на корневом элементе?
'@ XmlRootElement' достаточно, чтобы вы получили правильный экземпляр объекта после unmarshalling. Я думаю, проблема в том, что вы не разделили их как '@ XmlRootElement'. Может быть, вы можете подробно объяснить, почему вы не можете приложить к объекту корневого элемента напрямую, используя пункт 3 выше в моем ответе? – ulab
Оба класса модели Obj1 и Obj2 аннотируются с помощью «@XmlRootElement». Я полагаю, что постановка задачи несколько неоднозначна. Я хотел написать логику логического анализа, чтобы он мог принимать несколько «@XmlRootElement» и преобразовывать их в один объект. Я хотел сделать это, потому что вызов, который я делал во внешнюю службу REST, может возвращать разные типы объектов для одного и того же вызова. – Niru