spring - ModelMapper 与 Spring,在哪里放置显式映射?

标签 spring spring-boot modelmapper

我正在将 ModelMapper 与 Spring 一起使用。在我的 Controller 类中,我正在 Autowiring ModelMapper bean:

@Autowired
private ModelMapper mapper;

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

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

然后使用映射器来映射类。

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

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

最佳答案

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

尽管如此,我更喜欢创建多个专用映射器定义,每个类型或一组相关类型都有一个定义。

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

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

  • 一个 ModelMapper - 接收构造函数或
  • 一个带有 @PostConstruct 注释的方法,用于访问 @Autowired ModelMapper 属性。

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

关于spring - ModelMapper 与 Spring,在哪里放置显式映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52462219/

相关文章:

java - ModelMapper 在运行时更改泛型类型 - 奇怪的行为

java - 使用 Ajax 处理表单列表

Java Spring boot websocket与JS通信

spring - Camel 化 Spring 启动应用程序

java - 使用转换器和提供程序而不是属性映射时如何让 ModelMapper.validate() 成功?

java - 如何防止模型映射器在 spring data jpa 中急切加载关联集合?

java - 在 Spring MVC 应用程序的 JSP 页面中访问资源

java - Spring 3.1.1 web MVC - 限制对接口(interface) getter 的响应

java - 通过 @embeddedID 的 "query creation"方法构建 Spring Data JPA 查询

spring - 服务的 Zuul ReadTimeout