当前位置: 首页 > 知识库问答 >
问题:

如何避免DtoMappers层中的服务

危彬彬
2023-03-14

你好,我有一个基于spring boot的后端,我们正在使用自己的库将JPA实体转换为DTO的(库基于反射工作)。问题是,我们将服务层直接注入到一些映射器中。假设我有一个userentityuserdto。UserDto有一个名为avatar的字段,化身存储在S3中。因此,为了构建UserDto,我们使用如下代码

@Component
class UserMapper {

 @Inject
 S3Service s3Service;

 public UserDto toDto(UserEntity entity){
     UserDto dto = new UserDto();
     BeanUtils.copy(entity,dto);
     dto.setAvatar(s3Service.getAvatarByUser(entity));

}

}

我不喜欢这种方法,因为Mapper必须对服务层一无所知。但是,这个映射器也被其他映射器使用。如果我想返回一个OrderDto,它有一个嵌套的UserDto,所以OrderDto在内部调用UserMapper。有没有什么最佳实践可以让映射器免费使用服务?

到目前为止,我尝试了以下几种方法。

  1. 将头像存储在ThreadLocal缓存中。当controller调用服务获取用户时,service将用户的头像存储在ThreadLocal中,然后Mapper从ThreadLocal缓存中获取。缺点-很难测试,需要我做模拟
  2. 创建一个名为UserWithAvatar的单独POJO来存储UserEntity实体;字符串Avatar并为UserWithAvatar而不是UserEntity创建映射器。缺点-正如我所说的,此映射器将由OrderMapper使用,并且order mapper使用具有嵌套的UserEntityOrderEntity而不是UserWithAvatar

共有1个答案

谷梁楷
2023-03-14

我认为mapper应该在服务内部,但我会尝试处理您的需求

u有两种选择:

>

  • 您将服务和映射器都注入到控制器,将实体返回到控制器,并在返回响应之前使用映射器将其映射

    使用事件发布来发布事件,然后映射器捕获该事件并生成映射。之后,您可以直接将dto返回到controller或生成另一个事件。(默认情况下,事件发布是同步的,因此您不必担心并发问题)

    事件发布是通过spring完成的,导致非常不耦合的代码,其中发布者对事件订阅者一无所知,因此这两个可以在两个相互不了解的独立层中

    指南:https://www.baeldung.com/spring-Events

  •  类似资料:
    • 我使用Java实现了很多Selenium测试—有时,我的测试会因为StaleElementReferenceException而失败。 你能建议一些使测试更稳定的方法吗?

    • 理想的情况下,我希望我的应用程序只有顶级的try/catch,大多数的例外只是冒出来。但有了它,您将得到UnhandledPromiseRejectionWarning。 我的问题是,而不是再放一个。后面抓。那么,有没有办法绕过?谢谢!

    • 问题内容: 首先,它开始下载前三层,其中 一层完成后,第四层尝试开始下载。现在的问题是,直到 剩下的两层都完成了下载过程,它才会开始,并且在那之前 发生(我认为),第四层无法开始下载并中止 整个过程。所以我在想,如果一层一层地下载将 解决此问题。或者,也许是一种解决此问题的更好方法/选项, 当您没有非常快的Internet速度时,可能会发生这种情况。 问题答案: Docker守护程序具有一个–ma

    • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

    • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免

    • 问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc