6

在我们的项目中,我们必须将一个嵌套的 bean 结构映射到另一个。(这些实际上是 JAXB 映射的 XML 文档的 Java 表示,例如,表示传入的订单文档。)这必须映射到另一个系统的完全不同的订单文档结构。

有哪些选项可以做到这一点?我更喜欢满足以下要求的东西:

  1. 当未定义一个字段的映射时,映射应该提醒我
  2. 映射应该有一些默认值,例如将相同名称的字段映射到另一个字段,并为例如 int 到 String 提供标准映射,反之亦然。
  3. 映射应该是双向的。
  4. 在定义映射时应该能够使用代码完成。

一个有前途的框架是Dozer,但它不满足 1 和 4。与JBeanMapper相同。只需用 Java 编程就可以满足 4 个要求,但没有其他要求;使用 XSLT 可能满足 2,但仅此而已。你有更好的想法吗?

4

7 回答 7

5

ModelMapper是一个满足您所有条件的库。它提供了一个映射 API,该 API 使用实际代码来映射属性——因此您可以完成代码。它提供验证以确保映射所有目标属性。此外,它还提供了一些您甚至不知道自己想要的东西,例如智能地图 :)

查看 ModelMapper 主页了解更多信息:

http://modelmapper.org

于 2011-06-24T05:54:04.110 回答
3

另一种选择是MapStruct,它在构建时生成映射代码,从而产生在运行时不需要任何依赖项的类型安全映射(免责声明:我是 MapStruct 的作者)。

于 2013-06-07T19:04:08.353 回答
1

当我们遇到这个问题时,我们最终在一个实用程序类中使用 Java 进行字段映射。这是一个真正的麻烦,尤其是当您必须映射到几个不同的 Web 服务并且必须为每个服务编写映射时(其中一些是命名属性的简单 2D 映射,而不是对象的层次结构,cries)。

但是,通过这种方式,您确实有能力分析映射目标的要求以获得最佳质量映射,在未设置数据的情况下设置默认值,等等。您可以在需要的映射器中抛出自定义“UndefinedMappingException”。而且由于不是一个使用反射和/或复杂的 XML 映射配置文件的蓬松库,它的速度更快。

即,这是主张“用Java 编写”的帖子。

于 2008-12-17T11:58:07.180 回答
1

我用commons-beanutils解决了一个类似的问题。

我的最终目标是一个大的 Java 文件,它将构建数据结构,映射器为我创建了该文件。这样,我可以从程序运行时创建的快照创建测试数据。

映射器允许定义用于对对象进行排序的键、用于在 Java 文件中生成对象名称的字段,并且我使用了一个以“class:field”作为键的映射。该值是一个实现简单“映射”接口的对象(一种方法:toJava(Object instance, String field, Object value))。

我的主要问题是编译 2MB+ Java 文件 :)

于 2008-12-17T12:07:58.830 回答
1

Transmorph、EZMorph、Dozer、OTOM 是其中的一些,您可以查看 Bean 到 Bean 映射。我过去使用过 Dozer,感觉多年来它已经变得相当稳定。

于 2011-05-18T21:35:12.297 回答
1

看看 GeDA,它使用字节码在运行时创建映射类,这使得它非常快http://genericdtoassembler.org/。它将涵盖第 1-3 点。关于第 4 点,我想这是一个 IDE 的东西,所以我认为除非它有 IDE 插件,否则我认为你不会找到任何可以促进这一点的库。

于 2013-08-02T09:16:43.967 回答
0

如果您正在映射具有许多略有不同变体的数据结构,有一个有趣的解决方案可能会对您有所帮助。例如,如果您正在为不同的业务案例和产品变体建模业务订单结构,并且不同的变体需要相同属性的不同组合,例如地址、帐户 ID、产品的配置信息等。

因此,您有许多结构相似的 bean,它们包含许多属性的不同子集。如果您不想为每个单独的变体编写代码,则可以引入一个 Java 接口,该接口具有这些 bean 中出现的所有属性,并使用java.lang.reflect.Proxy为要映射的 bean 构造代理实例, 如果在实际 bean 上调用不存在的 setter,则实际 bean 没有的 getter 返回 null / 抛出异常。从某种意义上说,您将接口注入到那些方法比 bean 本身更多的 bean 中。

于 2011-01-06T11:31:28.780 回答