'UnsatisfiedDependencyException: Error creating bean with name
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.
Solution 1:[1]
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 the ClientService
and ClientServiceImpl
.
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 the ClientController
as you only have a single implementation for the service.
ClientService.java
@Service
public interface ClientService {
void addClient(Client client);
}
ClientServiceImpl.java (option 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 (option 2/preferred)
@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";
}
}
Solution 2:[2]
I know it seems too late, but it may help others in future.
I face the same error and the problem was that spring boot did not read my services package so add:
@ComponentScan(basePackages = {"com.example.demo.Services"})
(you have to specify your own path to the services package) and in the class demoApplication
(class that have main function) and for service interface must be annotated @Service
and the class that implement the service interface must be annotated with @Component
, then autowired the service interface.
Solution 3:[3]
Try adding @EntityScan(basePackages = "insert package name here") on top of your main class.
Solution 4:[4]
If you are using Spring Boot, your main app should be like this (just to make and understand things in simple way) -
package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....
Make sure you have @Repository and @Service appropriately annotated.
Make sure all your packages fall under - aaa.bbb.ccc.*
In most cases this setup resolves these kind of trivial issues. Here is a full blown example. Hope it helps.
Solution 5:[5]
That might happen because the pojos you are using lack of the precise constructor the service needs. That is, try to generate all the constructors for the pojo or objects (model object) that your serviceClient uses, so that the client can be instanced correctly. In your case,regenerate the constructors (with arguments)for your client object (taht is your model object).
Solution 6:[6]
I just added the @Repository
annotation to Repository interface and @EnableJpaRepositories
("domain.repositroy-package") to the main class. It worked just fine.
Solution 7:[7]
The application needs to be placed in the same directory as the scanned package:
Solution 8:[8]
I was facing the same issue, and it was, as i missed marking my DAO class with Entity annotations. I tried below and error got resolved.
/**
*`enter code here`
*/
@Entity <-- was missing earlier
public class Topic {
@Id
String id;
String name;
String desc;
.
.
.
}
Solution 9:[9]
Add @Repository annotation to the Spring Data JPA repo
Solution 10:[10]
According to documentation you should set XML configuration:
<jpa:repositories base-package="com.kopylov.repository" />
Solution 11:[11]
Considering that your package scanning is correctly set either through XML configuration or annotation based configuration.
You will need a @Repository
on your ClientRepository
implementation as well to allow Spring to use it in an @Autowired
. Since it's not here we can only suppose that's what's missing.
As a side note, it would be cleaner to put your @Autowired
/@Qualifier
directly on your member if the setter method is only used for the @Autowired
.
@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;
Lastly, you don't need the @Qualifier
is there is only one class implementing the bean definition so unless you have several implementation of ClientService
and ClientRepository
you can remove the @Qualifier
Solution 12:[12]
I had the exactly same issue, with a very very long stack trace. At the end of the trace I saw this:
InvalidQueryException: Keyspace 'mykeyspace' does not exist
I created the keyspace in cassandra, and solved the problem.
CREATE KEYSPACE mykeyspace
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
};
Solution 13:[13]
Check out the table structure of Client table, if there is a mismatch between table structure in db and the entity, you would get this error..
I had this error which was coming due to datatype mismatch of primary key between db table and the entity ...
Solution 14:[14]
If you describe a field as criteria in method definition ("findBy"), You must pass that parameter to the method, otherwise you will get "Unsatisfied dependency expressed through method parameter" exception.
public interface ClientRepository extends JpaRepository<Client, Integer> {
Client findByClientId(); ////WRONG !!!!
Client findByClientId(int clientId); /// CORRECT
}
*I assume that your Client entity has clientId attribute.
Solution 15:[15]
That was the version incompatibility where their was the inclusion of lettuce. When i excluded , it worked for me.
<!--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>
Solution 16:[16]
There is another instance still same error will shown after you doing everything above mentioned. When you change your codes accordingly mentioned solutions make sure to keep originals. So you can easily go back. So go and again check dispatcher-servelet configuration file's base package location. Is it scanning all relevant packages when you running application.
<context:component-scan base-package="your.pakage.path.here"/>
Solution 17:[17]
Add @Component annotation just above the component definition
Solution 18:[18]
This error can occur if there are syntax errors with Derived Query Methods. For example, if there are some mismatches with entity class fields and the Derived methods' names.
Solution 19:[19]
I was facing this issue because of duplicate column name staffId and staff_id in same entity class.
private Integer staffId;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "staff_id")
private User user;
Solution 20:[20]
My issue got resolved by adding "value" & "nativeQuery" tags in @Query annotation like this:
@Query(value = "select * from employee e where e.email_address = ?1", nativeQuery = true)
Solution 21:[21]
In my case, I was using dependency of spring boot 3
in spring boot 4.
make sure you use latest dependency version.
you can find that here https://mvnrepository.com/
Solution 22:[22]
Just add @Service annotation to top of the service class
Solution 23:[23]
See if your <context:component-scan base-package="your package "/>
is missing in either config or context xml file
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow