Я получаю сообщение об ошибке после запуска весенней загрузки в командной строке после этого: 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();
}
После добавления пользовательского репо + реализации для метода, даже после изменения только для возврата сообщения, у меня все еще есть проблема.
Если у кого-то есть такое же предложение, я попробую
Кстати, этот скрипт предназначен для изучения/изучения.




В 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, предоставляемые интерфейсами, которые он implements. Например, так обстоит дело с интерфейсом Jparepository: вы можете использовать customerRepository.findAll(), и вы не объявили (и не реализовали) этот метод в CustomerRepository (он был взят из реализации Jparepository, запакован для вас в зависимости, большинство наверное).
Теперь, когда вы создаете свой собственный интерфейс (TransactionRepoCustom) и реализуете его с помощью CustomerRepository, Spring пытается найти реализацию всех методов, объявленных в TransactionRepoCustom. Поскольку вы ничего не предоставили, Spring не может создать этот компонент для вас.
В этом случае с исправлением, которое я предоставил, Spring находит реализацию этого метода, поэтому он может создать bean-компонент для вас.
Наконец, я сказал, что рекомендуется предоставить реализацию для этого метода, потому что в Spring можно объявить методы в интерфейсе и предоставить их реализации в других классах (реализации по умолчанию для этого интерфейса). В этом случае вы можете создать для этого отдельный класс или реализовать метод getAllTransaction в CustomerRepository.
Когда есть только один метод (спорный), было бы неплохо объявить реализацию default в том же интерфейсе, но если интерфейс разрастется, его будет сложно поддерживать.
вау, это работа .. но я не совсем понимаю, почему я должен добавлять ключевое слово по умолчанию в свой интерфейс? так что, если я хочу добавить еще один метод в интерфейс TransactionRepoCustom? а как же рекомендация?
@Benikurniawan смотрите раздел Дополнительные примечания, который я только что добавил к ответу. Надеюсь, объяснил максимально подробно и ничего не упустил :)
хорошо, я понял, но как насчет того, чтобы мне нужен какой-то пользовательский метод? как getAllTransaction? если я помещу его в CustomerRepository, как я могу реализовать тело? так что извините за недостаток знаний
@Benikurniawan, плохо, вы не можете реализовать этот метод в CustomerRepository (не без использования механизма default, упомянутого в посте, это интерфейс!) вам нужно создать другой класс, который реализует TransactionRepoCustom... там вы реализуете свою логику для getAllTransaction. Извините за эту деталь, которую я пропустил :(.... Я обновил пост
я просто пытаюсь следовать вашей рекомендации, но все еще получаю ошибку, я нажимаю ее в основной ветке, я надеюсь, что вы / кто-нибудь может мне помочь
@Benikurniawan, новая проблема, с которой вы столкнулись, связана с недопустимым именем метода getAllTransaction .... посмотрите это, и вы поймете: stackoverflow.com/questions/51115098/… ... дайте мне знать, если вам наконец удастся ее решить ... если вы думаете, что это становится сложно для вас, опубликуйте еще один вопрос здесь, на SO, с полным журналом, который он сгенерировал в консоли .... Кстати, это отдельная проблема, отличная от той, которую вы задали в исходном вопросе .... поэтому я рекомендую вам опубликовать еще один вопрос
@Benikurniawan всего в нескольких словах .... методы, которые вы создаете в репозиториях интерфейсов, должны быть значимыми для JPA, чтобы сообщить ему, какой запрос он должен создать для вас для этого метода ... ключ в журнале это часть: Failed to create query for method public abstract java.lang.String com.cart.repository.TransactionRepoCustom.getAllTransaction()!No property getAllTransaction found for type Customer!
Кстати, что вы пытаетесь получить этим методом: getAllTransaction?
я хочу создать метод для получения всех транзакций с данными клиента, поэтому, на мой взгляд, я хочу создать хэш-карту, содержащую данные клиента + список деталей заказа в этом методе, или это не лучшее решение для весны или логики и т. д.? Любое предложение помочь мне лучше, я был бы признателен, кстати, я следую вашей рекомендации в № 1, но все равно получил имя компонента ошибки
Как выглядит ваша конфигурация с весенней загрузкой?