Как отобразить разные структуры Java-Bean друг на друга - PullRequest
6 голосов
/ 17 декабря 2008

В нашем проекте мы должны отобразить одну вложенную структуру bean-компонентов на другую. (На самом деле это сопоставленные JAXB Java-представления XML-документов, которые, скажем, представляют входящий документ заказа.) Это должно быть отображено в совершенно другой структуре документа заказа другой системы.

Какие есть варианты сделать это? Я бы предпочел что-то, что соответствует следующим требованиям:

  1. Отображение должно предупредить меня, когда отображение одного поля не было определено.
  2. Отображение должно иметь некоторые значения по умолчанию, такие как сопоставление полей с одинаковыми именами друг с другом и предоставление стандартных сопоставлений, скажем, int для String и наоборот.
  3. Отображение должно быть двунаправленным.
  4. Следует уметь использовать завершение кода при определении отображения.

Многообещающей структурой для этого является Dozer , но он не выполняет 1 и 4. То же самое с JBeanMapper . Просто программирование на Java делает 4, но не другие требования; использование XSLT выполняет, возможно, 2, но больше ничего. У тебя есть идеи получше?

Ответы [ 7 ]

5 голосов
/ 24 июня 2011

ModelMapper - это библиотека, которая отвечает всем вашим критериям. Он предлагает API сопоставления, который использует реальный код для сопоставления свойств - так что вы получите завершение кода. И он предлагает проверку, чтобы убедиться, что все свойства назначения сопоставлены. Кроме того, он предлагает некоторые вещи, о которых вы даже не подозревали, например интеллектуальное отображение :)

Посетите домашнюю страницу ModelMapper для получения дополнительной информации:

http://modelmapper.org

3 голосов
/ 07 июня 2013

Другой альтернативой является MapStruct , который генерирует код отображения во время сборки, что приводит к безопасным типам отображений, которые не требуют никаких зависимостей во время выполнения (Отказ от ответственности: я являюсь автором MapStruct).

1 голос
/ 02 августа 2013

Посмотрите на GeDA, который использует байт-код для создания классов отображения во время выполнения, что делает его чрезвычайно быстрым http://genericdtoassembler.org/. Это будет охватывать пункт 1-3. Что касается пункта 4, я бы подумал, что это вещь IDE, поэтому я не думаю, что вы найдете какую-либо библиотеку, которая могла бы облегчить это, если бы она не имела подключаемых модулей IDE.

1 голос
/ 19 мая 2011

Transmorph, EZMorph, Dozer, OTOM - вот некоторые из них, которые вы можете посмотреть на картирование Bean to Bean. Я использовал Dozer в прошлом и чувствую, что он стал довольно стабильным с годами.

1 голос
/ 17 декабря 2008

Я решил похожую проблему с commons-beanutils .

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

Картограф позволил определить ключи, по которым сортируются объекты, поле, которое будет использоваться для генерации имен объектов в файле Java, и я использовал карту с «class: field» в качестве ключа. Значением был объект, реализующий простой интерфейс «Сопоставление» (один из методов: toJava (экземпляр объекта, поле String, значение объекта)).

Моя основная проблема состояла в том, чтобы скомпилировать 2MB + файлы Java:)

1 голос
/ 17 декабря 2008

Когда у нас возникла эта проблема, мы закончили делать сопоставления полей в Java в служебном классе. Это настоящая проблема, особенно когда вам приходится отображать на несколько различных веб-сервисов и писать для каждого из них сопоставления (некоторые из которых представляют собой простую двумерную карту именованных атрибутов, а не иерархию объектов, плачет ).

Однако таким образом у вас есть возможность проанализировать требования целевого объекта отображения, чтобы получить лучшее качество отображения, установить значения по умолчанию, когда данные не установлены, и так далее. Вы можете добавить пользовательское «UndefinedMappingException» в ваш маппер, где вам нужно. И не будучи пушистой библиотекой, которая использует файлы конфигурации отражения и / или сложных XML-отображений, это чертовски быстро.

Т.е., это пост, в котором говорится "напишите на Java".

0 голосов
/ 06 января 2011

Существует интересное решение, которое может помочь вам, если вы отображаете структуры данных, которые имеют много слегка отличающихся вариантов. Например, если вы моделируете структуры бизнес-заказов для разных бизнес-случаев и вариантов продукта, а для разных вариантов требуются разные комбинации одних и тех же атрибутов, таких как адреса, идентификаторы счетов, информация о конфигурации для продуктов и т. Д.

Таким образом, у вас есть много структурно похожих бинов, которые содержат разные подмножества ряда атрибутов. Если вы не хотите писать код для каждого отдельного варианта, вы можете ввести Java-интерфейс, который имеет все атрибуты, встречающиеся в этих bean-компонентах, и использовать java.lang.reflect.Proxy для создания экземпляров прокси для bean-компонент, который вы хотите отобразить, и который возвращает null для получателей, фактический bean-компонент не имеет / выдает исключение, если для фактического bean-компонента вызывается несуществующий установщик. В некотором смысле, вы вводите интерфейс в те bean-компоненты, которые имеют больше методов, чем сам bean-компонент.

...