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