【问题标题】:ModelMapper with Spring, where to put explicit mappings?带有 Spring 的 ModelMapper,在哪里放置显式映射?
【发布时间】:2018-09-23 01:30:15
【问题描述】:

我将 ModelMapper 与 Spring 一起使用。在我的控制器类中,我正在自动装配 ModelMapper bean:

@Autowired
private ModelMapper mapper;

我想在我的控制器方法中在我的模型类和我的 DTO 之间进行显式映射,例如:

modelMapper.addMappings(mapper -> {
  mapper.map(src -> src.getBillingAddress().getStreet(),
      Destination::setBillingStreet);
  mapper.map(src -> src.getBillingAddress().getCity(),
      Destination::setBillingCity);
});

然后使用映射器映射类。

我的问题是,在每个控制器方法调用中添加显式映射是否正确?对象 modelMapper 的内存大小会开始增长吗?

其他解决方案是在创建 ModelMapper bean 时仅添加一次映射,但我认为将映射逻辑放入 bean 配置中不是一个好的决定。

【问题讨论】:

  • 感谢您的提问。正在开发需要 ModelMapper 的功能,但由于与您描述的相同原因,无法决定是使用 spring bean 还是简单的对象创建。

标签: spring spring-boot modelmapper


【解决方案1】:

ModelMapper的bean配置中设置映射逻辑是完全可以的。 映射是该类的实际任务,因此应在创建时进行配置。

不过,我更喜欢创建多个专用映射器定义,每个类型或相关类型组一个。

这样做可以将配置方面与控制器中映射器的实际使用分开 - 而不会在一个类中创建一大堆不相关的映射配置代码。 事实上,在每个控制器中配置映射器会违反 DRY(不要重复自己)和 SoC(关注点分离)等原则。

在您的情况下(单例ModelMapper),您可以为要映射的每种类型或类型组创建@Configuration 注释类。 在该类中,您将收到 ModelMapper 并添加类型映射。 将您的配置代码添加到其中一个

  • ModelMapper-receiving 构造函数或
  • 一个@PostConstruct-annotated 方法,它访问一个@Autowired ModelMapper 属性。

我自己还没有使用过ModelMapper,但是在查看了它的代码库之后,我猜想如果你按照原来的方法,内存使用量不会增加,但是你会发现重复映射被抛出的异常。

【讨论】:

  • 你能看看这个问题吗? stackoverflow.com/questions/53287450/…
  • 您能详细解释一下“为每种类型创建带有@Configuration 注释的类”吗?在每个配置文件中,我们都会有一个带有“@Bean”注释的函数,它返回一个模型映射器对象?你有什么例子吗?
  • “在该类中,您将收到 ModelMapper”,谁在调用模型映射器并将其传递给此配置类?
猜你喜欢
  • 2019-01-15
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
相关资源
最近更新 更多