Инкапсулировать чтение объектов из базы данных через репозиторий Spring?

#spring #spring-boot #spring-data

Вопрос:

В приложении 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 , которая реализует этот метод, чтобы было только одно место, где пользователь фактически извлекается.

Есть ли какие-либо рекомендации с архитектурной точки зрения? Может быть, другие приложения, которые я еще не рассматривал?

Ответ №1:

создание пользовательского сервиса также является хорошим моментом в случае «сокрытия» репозитория для предотвращения нежелательных операций (например, методов только для чтения).

Если вам нужно несколько раз указать пользователя в запросе, вы также можете прочитать его один раз в контроллере или службе запуска и поместить его в локальный поток для дальнейшего использования.

Или даже получить текущего пользователя в перехватчике и добавить его в текущий запрос.

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