For several days I'm trying to create Spring CRUD application. I'm confused.
I can't solve this errors.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clientController': Unsatisfied dependency expressed through method 'setClientService' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clientService': Unsatisfied dependency expressed through field 'clientRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.kopylov.repository.ClientRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
and this
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clientService': Unsatisfied dependency expressed through field 'clientRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.kopylov.repository.ClientRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@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> {
}
I looked through a lot of similar questions, but no one answer to them can't help me.
Best Answer
The ClientRepository should be annotated with
@Repository
tag. With your current configuration Spring will not scan the class and have knowledge about it. At the moment of booting and wiring will not find the ClientRepository class.EDIT If adding the
@Repository
tag doesn't help, then I think that the problem might be now with theClientService
andClientServiceImpl
.Try to annotate the
ClientService
(interface) with@Service
. As you should only have a single implementation for your service, you don't need to specify a name with the optional parameter@Service("clientService")
. Spring will autogenerate it based on the interface' name.Also, as Bruno mentioned, the
@Qualifier
is not needed in theClientController
as you only have a single implementation for the service.ClientService.java
ClientServiceImpl.java (option 1)
ClientServiceImpl.java (option 2/preferred)
ClientController.java