【问题标题】:Encapsulate the reading of objects from database via Spring repository?封装通过Spring存储库从数据库读取对象?
【发布时间】:2021-12-24 14:24:13
【问题描述】:

在 Spring Boot 应用程序中,我们经常使用不同 @Service 类中的方法从数据库中读取用户。以以下为例:

@Transactional
public void someMethodInServiceA(long userId) {
  User user = userRepository
    .findById(userId)
    .orElseThrow(() -> new EntityNotFoundException(String.format("User not found [id: %d]", userId)));
  // do something with the user object...
}

@Transactional
public void anotherMethodInServiceB(long userId) {
  User user = userRepository
    .findById(userId)
    .orElseThrow(() -> new EntityNotFoundException(String.format("User not found [id: %d]", userId)));
  // do something else...
}

由于从数据库中获取 User 对象的代码几乎相同,我的第一个想法是将其重构为像 UserService 这样实现此方法的公共服务,以便用户只有一个地方实际已获取。

从架构的角度有什么建议吗?也许我还没有考虑过其他方法?

【问题讨论】:

    标签: spring spring-boot spring-data


    【解决方案1】:

    在“隐藏”存储库以防止不需要的操作(例如只读方法)的情况下,创建 UserService 也是一个好点。

    如果您在请求中需要用户多次,您也可以在控制器或启动服务中读取一次,然后将其放入 ThreadLocal 中以供进一步使用。

    或者甚至在拦截器中获取当前用户并将其添加到当前请求中。

    https://www.baeldung.com/java-threadlocal

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      相关资源
      最近更新 更多