我在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配置中并不是一个好的决定。
答案 0 :(得分:2)
完全可以在ModelMapper
的bean配置中设置映射逻辑。
映射是该类的实际任务,因此应在创建类时对其进行配置。
尽管如此,我还是希望创建多个专用的映射器定义,每种类型或一组相关类型一个。
通过这种方式,可以使配置方面与控制器中的映射器的实际用法分开,而无需在一个类中创建大量无关的映射配置代码。 的确,在每个控制器中配置映射器会违反DRY(不再赘述)和SoC(关注点分离)之类的原则。
对于您的情况(单个ModelMapper
),您可以为要映射的每种类型或类型组创建@Configuration
注释的类。
在该类中,您将收到ModelMapper
并添加类型映射。
将配置代码添加到其中一个
ModelMapper
的构造函数或@PostConstruct
注释的方法,该方法访问@Autowired
ModelMapper
属性。我还没有亲自使用ModelMapper
,但是在探究了其代码库之后,我猜想如果您遵循原始方法,内存使用率将不会增加,但是您会发现抛出重复映射的异常。