UnsatisfiedDependencyException для метода клиента

Я получаю сообщение об ошибке после запуска весенней загрузки в командной строке после этого: 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();
}

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

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

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

Как выглядит ваша конфигурация с весенней загрузкой?

zappee 19.05.2019 10:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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? а как же рекомендация?

Beni kurniawan 19.05.2019 11:16

@Benikurniawan смотрите раздел Дополнительные примечания, который я только что добавил к ответу. Надеюсь, объяснил максимально подробно и ничего не упустил :)

lealceldeiro 19.05.2019 11:41

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

Beni kurniawan 19.05.2019 12:29

@Benikurniawan, плохо, вы не можете реализовать этот метод в CustomerRepository (не без использования механизма default, упомянутого в посте, это интерфейс!) вам нужно создать другой класс, который реализует TransactionRepoCustom... там вы реализуете свою логику для getAllTransaction. Извините за эту деталь, которую я пропустил :(.... Я обновил пост

lealceldeiro 19.05.2019 12:48

я просто пытаюсь следовать вашей рекомендации, но все еще получаю ошибку, я нажимаю ее в основной ветке, я надеюсь, что вы / кто-нибудь может мне помочь

Beni kurniawan 19.05.2019 18:17

@Benikurniawan, новая проблема, с которой вы столкнулись, связана с недопустимым именем метода getAllTransaction .... посмотрите это, и вы поймете: stackoverflow.com/questions/51115098/… ... дайте мне знать, если вам наконец удастся ее решить ... если вы думаете, что это становится сложно для вас, опубликуйте еще один вопрос здесь, на SO, с полным журналом, который он сгенерировал в консоли .... Кстати, это отдельная проблема, отличная от той, которую вы задали в исходном вопросе .... поэтому я рекомендую вам опубликовать еще один вопрос

lealceldeiro 19.05.2019 19:11

@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!

lealceldeiro 19.05.2019 19:24

Кстати, что вы пытаетесь получить этим методом: getAllTransaction?

lealceldeiro 19.05.2019 19:26

я хочу создать метод для получения всех транзакций с данными клиента, поэтому, на мой взгляд, я хочу создать хэш-карту, содержащую данные клиента + список деталей заказа в этом методе, или это не лучшее решение для весны или логики и т. д.? Любое предложение помочь мне лучше, я был бы признателен, кстати, я следую вашей рекомендации в № 1, но все равно получил имя компонента ошибки

Beni kurniawan 20.05.2019 06:36

Другие вопросы по теме