Я не верю, что вы можете использовать JAXB для применения пользовательских правил мета-сопоставления, подобных вашим.JAXB определяет свои собственные конкретные правила отображения XML / POJO и поддерживает только тип Java, пространство имен и другие относительно простые настройки, описанные в официальных документах для файла bindings.xjb
и инструмента xjc
.
Что вы можетеОднако нужно настроить конвейер синтаксического анализа XML на применение фильтрации до того, как события XML попадут в демаршаллинг JAXB.Вот как вы можете подключить свой пользовательский фильтр в JAXP:
JAXBContext jc = JAXBContext.newInstance(Document.class);
XMLFilter filter = new MyFilter();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
filter.setParent(sp.getXMLReader());
Unmarshaller unmarshaller = jc.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler =
unmarshaller.getUnmarshallerHandler();
filter.setContentHandler(unmarshallerHandler);
filter.parse(inputsource);
Вот так может выглядеть реализация универсального фильтра (обратите внимание, что это просто действует как фильтр идентификации; я оставил реализацию вашего пользовательского отображенияправила как упражнение:)
class MyFilter extends XMLFilterImpl {
@Override
public void startElement(String uri, String localName, String qName, Attributes atts)
throws SAXException {
super.startElement(uri, localName, qName, atts);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
}
}
Чтобы дать вам представление о том, что возможно с фильтрами, см., например.https://www.ibm.com/developerworks/community/forum/html/topic?id=60ef4f89-701a-447a-9375-3880115eb65a и http://blog.bdoughan.com/2012/11/applying-namespace-during-jaxb-unmarshal.html.
Наконец, обратите внимание, что для аннотирования элементов XML информацией о типе существует установленное соглашение об использовании атрибута xsi:type
, поэтому вы можете захотеть использовать егои измените свой дизайн, а не придумайте свои собственные правила отображения.