какой-либо инструмент для сопоставления объекта Java на объект? [закрыто]


231

Я пытаюсь преобразовать DO в DTO, используя Java и ищу автоматизированный инструмент, прежде чем начать писать свой собственный. Я просто хотел узнать, есть ли бесплатный инструмент для того же.


1
Джексон (библиотека JSON) имеет метод new ObjectMapper().convertValue(...). Джексон также поддерживает аннотации и аннотации-миксины, поэтому я считаю это очень хорошим вариантом.
Саймон Форсберг

1
Вот статья с различными фреймворками и сравнением производительности. baeldung.com/java-performance-mapping-frameworks
Кристиан

Ответы:


105

Вы можете попробовать Dozer .

Dozer - это преобразователь Java Bean в Java Bean, который рекурсивно копирует данные из одного объекта в другой. Как правило, эти Java-бины будут иметь разные сложные типы.

Dozer поддерживает простое сопоставление свойств, сложное сопоставление типов, двунаправленное сопоставление, неявно-явное сопоставление, а также рекурсивное сопоставление. Это включает в себя атрибуты набора сопоставлений, которые также должны отображаться на уровне элементов.


24
Очень, очень долгое время спустя, я прихожу, чтобы сделать обновление, я надеюсь, что мой комментарий будет прочитан: теперь Dozer кажется мертвым, и хорошим вариантом является использование MapStruct, это просто (поддержка аннотаций), быстро (без отражения ) и кажется безопасным (на данный момент). Это включено в список @Pascal Thivent, но я советую это (даже если у меня были некоторые проблемы при использовании его вместе с lombok).
Алекс

2
Дозер, похоже, возродился с версией 6: mvnrepository.com/artifact/com.github.dozermapper/dozer-core
tkruse

394

Там есть несколько библиотек:

  • Commons-BeanUtils : ConvertUtils -> служебные методы для преобразования строковых скалярных значений в объекты указанного класса, строковые массивы в массивы указанного класса.

  • Commons-Lang : ArrayUtils -> Операции над массивами, примитивными массивами (например, int []) и массивами примитивных оболочек (например, Integer []).

  • Spring Framework : Spring имеет отличную поддержку PropertyEditors, которую также можно использовать для преобразования объектов в / из строк.

  • Dozer : Dozer - мощный, но простой инструмент преобразования Java Bean в Java Bean, который рекурсивно копирует данные из одного объекта в другой. Как правило, эти Java-бины будут иметь разные сложные типы.

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

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

  • Orika : Orika использует генерацию байт-кода для создания быстрых картографов с минимальными издержками.

  • Selma : генератор кода времени компиляции для отображений

  • JMapper : Генерация bean mapper с использованием аннотаций, XML или API (кажется мертвым, последнее обновление 2 года назад)

  • Smooks : Smooks JavaBean Cartridge позволяет создавать и заполнять объекты Java из данных вашего сообщения (т. Е. Связывать данные) (предложено superfilin в комментариях). (Больше не в активном развитии)

  • Commons-Convert : Commons-Convert стремится предоставить единую библиотеку, предназначенную для задачи преобразования объекта одного типа в другой. На первом этапе основное внимание будет уделено преобразованию объектов в строки и строк в объекты. (кажется мертвым, последнее обновление 2010)

  • Transmorph : Transmorph - это бесплатная библиотека Java, используемая для преобразования объекта Java одного типа в объект другого типа (с другой сигнатурой, возможно параметризованной). (кажется мертвым, последнее обновление 2013)

  • EZMorph : EZMorph это простая библиотека Java для преобразования объекта в другой объект. Он поддерживает преобразования для примитивов и объектов, для многомерных массивов и преобразований с помощью DynaBeans (кажется мертвым, последнее обновление 2008 г.)

  • Morph : Morph - это инфраструктура Java, которая облегчает внутреннюю совместимость приложения. По мере того, как информация проходит через приложение, она подвергается множественным преобразованиям. Morph предоставляет стандартный способ реализации этих преобразований. (кажется мертвым, последнее обновление 2008 года)

  • Lorentz : Lorentz - это универсальная структура преобразования объекта в объект. Он предоставляет простой API для преобразования объектов Java одного типа в объект другого типа. (кажется мертвым)

  • OTOM : с помощью OTOM вы можете копировать любые данные из любого объекта в любой другой объект. Возможности безграничны. Добро пожаловать в «Осень». (кажется мертвым)


Ни один из списка не поддерживает аннотации :(
ravinikam

1
Commons-Convert кажется не просто бездействующим, но полностью ушедшим сейчас ...
Джим Ферранс

На самом деле, если вы хотите добавить Moo в свой список, я могу удалить свой ответ, поскольку ваш ответ явно гораздо более полный. ;)
Джеффри Уайзман

3
Еще один вариант для Java 8+: erchu.github.io/bean-cp (отказ от ответственности: я являюсь автором этого проекта)
Rafal

1
@TmTron: Готово, и я отредактировал ответ, чтобы удалить страйк и ссылаться на URL репо (поскольку главная страница все еще ссылается на 0.7.5)
patric.schenke

31

Еще один - Орика - https://github.com/orika-mapper/orika

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

Орика стремится максимально автоматизировать процесс, обеспечивая при необходимости настройку конфигурации и расширения.

Orika позволяет разработчику:

  • Карта сложных и глубоко структурированных объектов
  • «Свести» или «Развернуть» объекты путем сопоставления вложенных свойств со свойствами верхнего уровня и наоборот
  • Создавайте сопоставители на лету и применяйте настройки для управления некоторыми или всеми сопоставлениями
  • Создание конвертеров для полного контроля над отображением определенного набора объектов в любом месте графа объектов - по типу или даже по определенному имени свойства
  • Обрабатывать прокси или расширенные объекты (например, Hibernate или различные фиктивные фреймворки)
  • Применить двунаправленное отображение с одной конфигурацией
  • Сопоставление с экземплярами соответствующего конкретного класса для целевого абстрактного класса или интерфейса
  • Обрабатывать обратные сопоставления
  • Обрабатывать сложные соглашения помимо спецификаций JavaBean.

Orika использует генерацию байтового кода для создания быстрых картографов с минимальными издержками.


2
Вы можете сказать несколько слов об orika - чем она отличается от других
Olimpiu POP

Это, вероятно, намного быстрее, чем Dozer - dozer работает медленно.
Ондрей Бозек

21

ModelMapper - еще одна библиотека, которую стоит проверить. Дизайн ModelMapper отличается от других библиотек тем, что он:

  • Автоматическое сопоставление моделей объектов путем интеллектуального сопоставления свойств источника и назначения
  • Обеспечивает рефакторинг API безопасного отображения, который использует фактический код для сопоставления полей и методов, а не с использованием строк
  • Использует соглашения на основе конфигурации для простой обработки пользовательских сценариев

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

http://modelmapper.org


13

Используйте Apache Commons beanutils:

static void copyProperties(Object dest, Object orig) Копировать значения свойств из исходного объекта в целевой для всех случаев, когда имена свойств совпадают.

http://commons.apache.org/proper/commons-beanutils/


3
да, но свойства, которые находятся в исходном компоненте, но отсутствуют в целевом компоненте, просто игнорируются. В любом случае, спасибо, Паблоим :) Я думаю, что мне нужно идти с Dozer, поскольку у нас есть несколько имен свойств для DO и DTO :(
ravinikam

1
Достаточно справедливо - я не знал этого ... Список Паскаля был довольно впечатляющим!
Паблоим


3

Я предлагаю вам попробовать JMapper Framework .

Это преобразователь bean-компонента Java to Java позволяет динамически передавать данные с помощью аннотаций и / или XML.

С JMapper вы можете:

  • Создавайте и обогащайте целевые объекты
  • Применить конкретную логику к отображению
  • Автоматически управлять файлом XML
  • Реализуйте отношения 1 к N и N к 1
  • Реализуйте явные преобразования
  • Применить унаследованные конфигурации

2

Я рад добавить Moo в качестве опции, хотя явно склонен к этому: http://geoffreywiseman.github.com/Moo/

Его очень просто использовать для простых случаев, разумно способных к более сложным случаям, хотя есть еще области, где я могу представить, как его усилить для еще большей сложности.


2

Вы также можете попробовать картографический фреймворк на основе Dozer, но с объявлением картографирования в Excel. У них есть некоторые инструменты и дополнительные интересные функции. Проверьте на http://openl-tablets.sf.net/mapper

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.