UnsatisfiedDependencyException для метода клиента - PullRequest
2 голосов
/ 19 мая 2019

Я получаю сообщение об ошибке после запуска весенней загрузки в командной строке: https://egkatzioura.com/2016/06/03/add-custom-functionality-to-a-spring-data-repository/

Код моего проекта на github: https://github.com/b3nhysteria/exprole_spring

Проблема в приложении:

System.out.println("============"+customerService.getListTransactionByCustomer());

Реализация в сервисе:

public String getListTransactionByCustomer (){
    return customerRepository.getAllTransaction();
}

После добавления пользовательской реализации repo + для метода, даже после изменения только для возврата сообщения, у меня все еще есть проблема.

Если у кого-то есть такое же предложение, я попробую

Кстати, этот скрипт для изучения / изучения.

1 Ответ

2 голосов
/ 19 мая 2019

В CustomerRepository вы внедряете TransactionRepoCustom

public interface CustomerRepository extends JpaRepository<Customer, CustomerId>, TransactionRepoCustom {
    // ...
}

Итак, Spring пытается найти реализацию метода public String getAllTransaction(), объявленного в TransactionRepoCustom (и не может этого сделать).

Таким образом, чтобы исправить это, вам необходимо:

  • Реализовать getAllTransaction;возможно, создайте другой класс TransactionRepoCustomImpl (рекомендуется!) или
  • Объявите реализацию по умолчанию для getAllTransaction в интерфейсе (если вы используете Java 8).

После первогоподход будет выглядеть примерно так:

public class TransactionRepoCustomImpl implements TransactionRepoCustom {
    @Override
    public String getAllTransaction() {
        return "logic for your custom implementation here";
    }
}

В соответствии с последним подходом это будет:

public interface TransactionRepoCustom {
    public default String getAllTransaction() {
        return "Not implemented yet!"; // of course, this is just a naive implementation to state my point
    }
}

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

Дополнительные примечания:

Это происходит потому, что Spring использует скрытые реализации по умолчанию (метод) для CustomerRepository, предоставляемые интерфейсами it implements,Например, это относится к интерфейсу Jparepository: вы можете использовать customerRepository.findAll(), и вы не объявили (и не реализовали) этот метод в CustomerRepository (он был взят изреализация Jparepository, упакованная для вас в зависимости, скорее всего).

Теперь, когда вы создаете свой собственный интерфейс (TransactionRepoCustom) и реализуете его с помощью CustomerRepository, Spring пытается найти реализациюиз всех методов, объявленных в TransactionRepoCustom.Поскольку вы не предоставили ничего, Spring не может создать этот компонент для вас.

В этом случае с предоставленным мною исправлением Spring находит реализацию этого метода, поэтому он может создать компонент для вас.

Наконец, я сказал, что рекомендуется предоставить реализацию для этого метода, потому что способ сделать что-то в Spring - объявить методы в интерфейсе и предоставить их реализации в других классах (реализации по умолчанию для этого интерфейса).В этом случае вы можете создать отдельный класс для этого или реализовать метод getAllTransaction в CustomerRepository.

Когда есть только один метод (спорный), было бы хорошо объявить реализацию default втот же интерфейс, но если интерфейс растет, его может быть сложно поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...