Подтвердить что ты не робот

UnsatisfiedDependencyException: ошибка при создании bean с именем

В течение нескольких дней я пытаюсь создать приложение Spring CRUD. Я смущен. Я не могу решить эти ошибки.

org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean с именем "clientController": недопустимая зависимость, выраженная через параметр "setClientService" 0; Вложенное исключение - org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean с именем "clientService": недопустимая зависимость, выраженная через поле "clientRepository"; Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: Не существует квалификационного bean типа "com.kopylov.repository.ClientRepository": ожидается как минимум 1 bean, который квалифицируется как кандидат на автоуверсию. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(required = true)}

и этот

org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean с именем "clientService": недопустимая зависимость, выраженная через поле "clientRepository"; Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: Не существует квалификационного bean типа "com.kopylov.repository.ClientRepository": ожидается как минимум 1 bean, который квалифицируется как кандидат на автоуверсию. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(required = true)}

ClientController

@Controller
public class ClientController {
private ClientService clientService;

@Autowired
@Qualifier("clientService")
public void setClientService(ClientService clientService){
    this.clientService=clientService;
}
@RequestMapping(value = "registration/add", method = RequestMethod.POST)
public String addUser(@ModelAttribute Client client){
    this.clientService.addClient(client);
return "home";
}
}

ClientServiceImpl

@Service("clientService")
public class ClientServiceImpl implements ClientService{

private ClientRepository clientRepository;

@Autowired
@Qualifier("clientRepository")
public void setClientRepository(ClientRepository clientRepository){
    this.clientRepository=clientRepository;
}



@Transactional
public void addClient(Client client){
    clientRepository.saveAndFlush(client);
}
}

ClientRepository

public interface ClientRepository extends JpaRepository<Client, Integer> {

}

Я просмотрел множество подобных вопросов, но ни один ответ на них не может мне помочь.

4b9b3361

Ответ 1

Клиентский репозиторий должен быть аннотирован тегом @Repository. С вашей текущей конфигурацией Spring не сканирует класс и не знает об этом. В момент загрузки и проводки не будет найден класс ClientRepository.

ИЗМЕНИТЬ Если добавление тега @Repository не помогает, то я думаю, что проблема может быть теперь с ClientService и ClientServiceImpl.

Попробуйте аннотировать ClientService (интерфейс) с помощью @Service. Поскольку для вашей службы требуется только одна реализация, вам не нужно указывать имя с необязательным параметром @Service("clientService"). Spring будет автогенерировать его на основе имени интерфейса.

Кроме того, как отметил Бруно, @Qualifier не требуется в ClientController, поскольку у вас есть только одна реализация для этой службы.

ClientService.java

@Service
public interface ClientService {

    void addClient(Client client);
}

ClientServiceImpl.java (вариант 1)

@Service
public class ClientServiceImpl implements ClientService{

    private ClientRepository clientRepository;

    @Autowired
    public void setClientRepository(ClientRepository clientRepository){
        this.clientRepository=clientRepository;
    }

    @Transactional
    public void addClient(Client client){
        clientRepository.saveAndFlush(client);
    }
}

ClientServiceImpl.java (вариант 2/предпочтительный)

@Service
public class ClientServiceImpl implements ClientService{

    @Autowired
    private ClientRepository clientRepository;

    @Transactional
    public void addClient(Client client){
        clientRepository.saveAndFlush(client);
    }
}

ClientController.java

@Controller
public class ClientController {
    private ClientService clientService;

    @Autowired
    //@Qualifier("clientService")
    public void setClientService(ClientService clientService){
        this.clientService=clientService;
    }

    @RequestMapping(value = "registration", method = RequestMethod.GET)
    public String reg(Model model){
        model.addAttribute("client", new Client());
        return "registration";
    }

    @RequestMapping(value = "registration/add", method = RequestMethod.POST)
    public String addUser(@ModelAttribute Client client){
        this.clientService.addClient(client);
    return "home";
    }
}

Ответ 2

Попробуйте добавить @EntityScan (basePackages = "вставить имя пакета здесь" ) поверх вашего основного класса.

Ответ 3

Это может произойти из-за того, что используемые вами pojos не имеют точного конструктора, в котором нуждается сервис. То есть попробуйте сгенерировать все конструкторы для pojo или объектов (объект модели), которые использует ваш serviceClient, чтобы клиент мог быть правильно создан. В вашем случае, заново сгенерируйте конструкторы (с аргументами) для вашего клиентского объекта (таков объект вашей модели).

Ответ 4

Учитывая, что сканирование пакетов правильно установлено либо с помощью конфигурации XML, либо с помощью настройки, основанной на аннотации.

Вам понадобится @Repository в вашей реализации ClientRepository, чтобы позволить Spring использовать его в @Autowired. Поскольку это не здесь, мы можем только предположить, что недостающее.

В качестве побочного примечания было бы проще разместить ваш @Autowired/@Qualifier непосредственно на вашем члене, если метод setter используется только для @Autowired.

@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;

Наконец, вам не нужен @Qualifier, существует только один класс, реализующий определение bean, поэтому, если у вас есть несколько вариантов реализации ClientService и ClientRepository, вы можете удалить @Qualifier

Ответ 5

Я просто добавил аннотацию @Repository в интерфейс Repository и @EnableJpaRepositories ("domain.repositroy-package") в основной класс. Работало просто отлично.

Ответ 6

Если вы используете Spring Boot, ваше основное приложение должно быть таким (просто чтобы понять и понять вещи простым способом) -

package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....

Убедитесь, что у вас есть @Repository и @Service с соответствующими комментариями.

Убедитесь, что все ваши пакеты попадают под - aaa.bbb.ccc. *

В большинстве случаев такая настройка решает подобные тривиальные проблемы. Вот полный пример. Надеюсь, поможет.

Ответ 7

Добавить примечание @Repository к репозиторию данных JPA Spring

Ответ 8

В соответствии с документацией вы должны установить конфигурацию XML:

<jpa:repositories base-package="com.kopylov.repository" />

Ответ 9

У меня была точно такая же проблема, с очень очень длинной трассировкой стека. В конце следа я увидел это:

InvalidQueryException: пространство ключей 'mykeyspace' не существует

Я создал пространство клавиш в Кассандре и решил проблему.

CREATE KEYSPACE mykeyspace
  WITH REPLICATION = { 
   'class' : 'SimpleStrategy', 
   'replication_factor' : 1 
  };

Ответ 10

Я столкнулся с той же самой проблемой, и это было, поскольку я пропустил пометку моего класса DAO с аннотациями Entity. Я попытался ниже, и ошибка была решена.

/**
*'enter code here'
*/
@Entity <-- was missing earlier
    public class Topic {
        @Id  
        String id;
        String name;
        String desc;

    .
    .
    .
    }

Ответ 11

Проверьте структуру таблицы таблицы Client, если есть несоответствие между структурой таблицы в db и сущностью, вы получите эту ошибку.

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

Ответ 12

Если вы описываете поле как критерий в определении метода ("findBy"), вы должны передать этот параметр методу, в противном случае вы получите исключение "Неудовлетворенная зависимость, выраженная через параметр метода".

public interface ClientRepository extends JpaRepository<Client, Integer> {
       Client findByClientId();                ////WRONG !!!!
       Client findByClientId(int clientId);    /// CORRECT 
}

* Я предполагаю, что у вашей клиентской сущности есть атрибут clientId.

Ответ 13

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

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

@ComponentScan(basePackages = {"com.example.demo.Services"}) (необходимо указать собственный путь к пакету служб) и в классе demoApplication (класс, который имеет основную функцию), а для интерфейса службы должна быть аннотирована @Service и класс, реализующий интерфейс службы, должны быть аннотированы @Component, а затем автоматически подключены к интерфейсу службы.

Ответ 14

Проверьте, отсутствует ли ваш файл в конфигурационном или контекстном XML файле.

Ответ 15

Это была версия несовместимости, где их было включение салата. Когда я исключил, это сработало для меня.

<!--Spring-Boot 2.0.0 -->
    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>io.lettuce</groupId>
                        <artifactId>lettuce-core</artifactId>
                    </exclusion>
                </exclusions>    
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>

Ответ 16

это возможно до конфликта банок 。。。

Ответ 17

Просто добавьте аннотацию @Service в начало класса обслуживания

Ответ 18

Существует другой экземпляр, все еще та же ошибка, которая будет показана после того, как вы сделаете все вышеупомянутое. при изменении ваших кодов соответственно упомянутых решений обязательно сохраняйте оригиналы. Так что вы можете легко вернуться. Перейдите и еще раз проверьте расположение базового пакета файла конфигурации диспетчера-сервлета. Проверяет ли он все соответствующие пакеты при запуске приложения.

<context:component-scan base-package="your.pakage.path.here"/>

Ответ 19

Приложение должно быть размещено в том же каталоге, что и отсканированный пакет:

enter image description here