带Spring的ModelMapper,在哪里放置显式映射?

时间:2018-09-23 01:30:16

标签: spring spring-boot modelmapper

我在Spring中使用ModelMapper。在我的控制器类中,我将自动装配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配置中并不是一个好的决定。

1 个答案:

答案 0 :(得分:2)

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

尽管如此,我还是希望创建多个专用的映射器定义,每种类型或一组相关类型一个。

通过这种方式,可以使配置方面与控制器中的映射器的实际用法分开,而无需在一个类中创建大量无关的映射配置代码。 的确,在每个控制器中配置映射器会违反DRY(不再赘述)和SoC(关注点分离)之类的原则。

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

  • 接收ModelMapper的构造函数或
  • 使用@PostConstruct注释的方法,该方法访问@Autowired ModelMapper属性。

我还没有亲自使用ModelMapper,但是在探究了其代码库之后,我猜想如果您遵循原始方法,内存使用率将不会增加,但是您会发现抛出重复映射的异常。