Как расширить bean-компонент для репозитория Spring, сохранив существующий метод запроса dsl - PullRequest
1 голос
/ 10 января 2020

В моей текущей реализации я использую bean-репозиторий Spring, который определен в зависимом фляге. Допустим, это мой ModelRepository, определенный в зависимом банке

@Repository
public interface ModelRepository extends CustomModelRepository{
  Optional<Model> findByModelId(String id);     
}

* CustomModelRepository и CustomModelRepositoryImpl также определены в зависимом банке. Теперь в текущей реализации я хочу использовать этот весенний репозиторий, чтобы также иметь другой метод запроса dsl. Допустим, я хочу добавить и использовать метод запроса

List<Model> findByAnotherModelId(String id);

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

Ответы [ 2 ]

1 голос
/ 17 января 2020

Таким образом, я наконец смог решить проблему, избежав изменений в catashprohi c.

Шаг 1:

Создайте интерфейс, расширяющий основной компонент репозитория. из зависимого фляги и вашего требуемого метода запроса dsl. Этот репозиторий теперь имеет все методы dsl, которые ModelRepository.

@Repository
public interface WrapperModelRepository extends ModelRepository{
  List<Model> findByAnotherModelId(String id);    
}

Шаг 2: . Теперь наша работа была закончена, если в ModelRepository не было пользовательских методов запросов. Но мы должны поддерживать пользовательский метод запроса, определенный в CustomModelRepository. Если мы этого не сделаем, то наш репозиторий-оболочка прервется при запуске bean-компонента, поскольку он не сможет найти имплементацию пользовательского метода запроса, определенного в CustomModelRepositoryImpl. Поэтому для этого нам нужно создать еще один класс Impl для хранилища-обертки, который может просто обернуть реализацию пользовательского метода запроса.

@Component
public class WrapperModelRepositoryImpl implments WrapperModelRepository {

  private CustomModelRepositoryImpl customModelRepository;

  public WrapperModelRepositoryImpl(CustomModelRepositoryImpl repository){
    this.customModelRepository = repository;
  }

  public Model exactQueryMethodNameDeclaredInCustomModelRepository(){
    return customModelRepository.exactQueryMethodNameDeclaredInCustomModelRepository()
  }
}

Теперь наш обязательный компонент создается, если вы не забудете упомянуть об этом ( ваш текущий пакет реализации оболочки), в ваших @EnableJpaRepositories репозиториях, для Spring, чтобы создавать репозитории для вас.

0 голосов
/ 10 января 2020

Существует так называемый сервисный уровень, то есть класс ModelService, который обычно используется для всех бизнес-логик c приложения. Там вы можете определить, какой экземпляр Model должен go использовать методы хранилища для работы с постоянством. (ps возможно я не понял Вашу проблему правильно, пожалуйста, укажите, что если так ...)

...