JAXB / EclipseLink: динамическое удаление типа - PullRequest
2 голосов
/ 30 марта 2012

У меня есть служба, которая должна иметь возможность предоставлять «профили пользователей» с разным уровнем детализации или разными режимами детализации.

Эти профили пользователей синхронизируются в базе данных с JPA2, и все работает нормально.Используя MOXy (EclipseLink), я также сериализую в XML профили, и здесь все работает нормально.

Однако режимы многословия (BRIEF, SUMMARY, FULL) реализуются с помощью наличия или отсутствия конкретных элементов.в профилях пользователей, сериализованных в XML (например, элемент QueryHistory не должен сериализоваться при использовании режима подробности BRIEF).

В двух словах: я хочу указать JAXBContext, что некоторые элементы не должны сериализоватьсяи я хочу указать это во время выполнения .

Если я хорошо понял, MOXy Extensible Models - Refresh http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html может это сделать, но кто-то здесь знает более простойспособ реализовать эту функцию?

1 Ответ

2 голосов
/ 30 марта 2012

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222) экспертная группа.

Чтобы поддержать концепцию разных представлений ваших данных, я бы рекомендовал иметь другой экземпляр JAXBContext для представления каждого из отображений: КРАТКОЕ, РЕЗЮМЕ, ПОЛНОЕ.MOXy позволяет применять несколько сопоставлений к модели домена, используя его внешний документ сопоставления .

Стратегии

  1. Аннотации для полной картымоделировать и использовать метаданные XML для сокращения отображений
  2. аннотации для отображения минимальной модели и использовать метаданные XML для расширения отображений

Пример кода

Три экземпляра JAXBContext построены на одном классе (UserProfile), но с разными сопоставлениями, контролируемыми документом внешнего сопоставления MOXy.

JAXBContext briefContext = JAXBContext.newInstance(UserProfile.class);

Map<String, Object> summaryProperties = new HashMap<String, Object>(1);
summaryProperties.put("eclipselink-oxm-xml", "summaryMapping.xml");
JAXBContext summaryContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, summaryProperties);

List<String> fullMappingXMLs = new ArrayList(2);
fullMappingXMLs.add("summaryMapping.xml");
fullMappingXMLs.add("fullMapping.xml");
Map<String, Object> fullProperties = new HashMap<String, Object>(1);
fullProperties.put("eclipselink-oxm-xml", fullMappingXMLs);
JAXBContext fullContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, fullProperties);

Ниже приведен пример, демонстрирующий, как JAXBContext можно загрузить из нескольких картографических документов.

Расширяемые модели

Возможность расширенияМетаданные отображения в MOXy предназначены для разработчиков, которые хотят внести изменения в метаданные, не отключая работающее приложение.Примером этого является модель предметной области, поддерживающая онлайн-опрос, который необходимо усовершенствовать для поддержки нового вопроса.

...