it-roy-ru.com

UnsatisfiedDependencyException: ошибка создания бина с именем

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

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

и это

org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка при создании компонента с именем 'clientService': неудовлетворенная зависимость, выраженная через поле 'clientRepository'; Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: квалифицируемый компонент типа 'com.kopylov.repository.ClientRepository' недоступен: ожидается, что по крайней мере 1 компонент будет квалифицирован как кандидат для автоматического подключения Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = 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> {

}

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

27
kopylov

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

EDIT Если добавление тега @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";
    }
}
14
Alex Roig

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

1
Ricuzzo

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

1
Shubham Chopra

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

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

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

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

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

1
Bruno Delor

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

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

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

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

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

0
Nesryna

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

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

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

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

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

0
Ajay Kumar

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

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

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

0
ben fadhel Ichraf

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

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

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

0
ÖMER TAŞCI

Добавить аннотацию @Repository в репозиторий Spring Data JPA

0
Sergio

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

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

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

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

    .
    .
    .
    }
0
Nitish Sharma

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

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

0
Siddaraju Siddappa