Несколько маршаллеров / анмаршаллеров с Spring OXM
У меня есть устаревший проект веб-службы, который получает две разные схемы XML, но с одним и тем же именем атрибута (включая корневой элемент). Я использую Spring, OXM и JAXB2 для маршаллинга / демаршаллинга.
Я решил предыдущую проблему с другим вопросом, поэтому я использую парсер SAX, чтобы определить, какой unmarshaller использовать. Когда XML разбирается, я проверяю значение и затем могу использовать unmarshaller или другой unmarshaller.
Моя проблема возникает, когда я пытаюсь определить маршаллер / демаршаллер с помощью Spring OXM. Если я установил classpath с двумя пакетами, он потерпит неудачу, потому что unmarshaller находит два класса с одинаковым XMLRootElement. Если я устанавливаю список привязываемых классов, он тоже терпит неудачу, потому что unmarshaller всегда unmarshall до последнего элемента в списке классов (тот же XMLRootElement, unmarshaller не знает, какой класс unmarshall).
Но это работает правильно, если я использую JaxbContext:
JAXBContext jc = JAXBContext.newInstance(MyClass1.class);
myClass1Object = (MyClass1) jc.createUnmarshaller().unmarshal(new StreamSource(new StringReader(xml)));
А также
JAXBContext jc = JAXBContext.newInstance(MyClass2.class);
myClass2Object = (MyClass2) jc.createUnmarshaller().unmarshal(new StreamSource(new StringReader(xml)));
Как я могу преобразовать это в более Spring (OXM) подход?
1 ответ
Прежде всего я попытался объявить экземпляр JAXBContext в файле контекста приложения, но в конце концов я решил изменить пространство имен одной XML-схемы. Теперь я использую Spring OXM, чтобы маршалировать / отменять маршалирование двух моих XML-схем без каких-либо проблем.