UnsatisfiedDependencyException: Error creating bean with name

JavaSpringSpring Mvc

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

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 - Java

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 - Java

Try adding @EntityScan(basePackages = "insert package name here") on top of your main class.

Solution 4 - Java

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 - Java

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 - Java

I just added the @Repository annotation to Repository interface and @EnableJpaRepositories ("domain.repositroy-package") to the main class. It worked just fine.

Solution 7 - Java

The application needs to be placed in the same directory as the scanned package:

enter image description here

Solution 8 - Java

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 - Java

Add @Repository annotation to the Spring Data JPA repo

Solution 10 - Java

According to documentation you should set XML configuration:

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

Solution 11 - Java

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 - Java

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 - Java

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 - Java

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 - Java

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 - Java

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 - Java

Add @Component annotation just above the component definition

Solution 18 - Java

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 - Java

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 - Java

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 - Java

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 - Java

See if your <context:component-scan base-package="your package "/> is missing in either config or context xml file

Solution 23 - Java

Just add @Service annotation to top of the service class

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkopylovView Question on Stackoverflow
Solution 1 - JavaAlex RoigView Answer on Stackoverflow
Solution 2 - Javaben fadhel IchrafView Answer on Stackoverflow
Solution 3 - JavaShubham ChopraView Answer on Stackoverflow
Solution 4 - JavaAjay KumarView Answer on Stackoverflow
Solution 5 - JavaRicuzzoView Answer on Stackoverflow
Solution 6 - JavaNesrynaView Answer on Stackoverflow
Solution 7 - JavaoceangsView Answer on Stackoverflow
Solution 8 - JavaNitish SharmaView Answer on Stackoverflow
Solution 9 - JavaSergioView Answer on Stackoverflow
Solution 10 - JavaDmitry GorkovetsView Answer on Stackoverflow
Solution 11 - JavaBruno DelorView Answer on Stackoverflow
Solution 12 - JavaKristóf DombiView Answer on Stackoverflow
Solution 13 - JavaSiddaraju SiddappaView Answer on Stackoverflow
Solution 14 - JavaÖMER TAŞCIView Answer on Stackoverflow
Solution 15 - JavaVaibsView Answer on Stackoverflow
Solution 16 - JavasashiksuView Answer on Stackoverflow
Solution 17 - JavaRajeev RanjanView Answer on Stackoverflow
Solution 18 - JavaSachithra DilshanView Answer on Stackoverflow
Solution 19 - JavaAamir ShaikhView Answer on Stackoverflow
Solution 20 - JavaBilal SheikhView Answer on Stackoverflow
Solution 21 - JavaSaurabh DhageView Answer on Stackoverflow
Solution 22 - JavaHimanshu ShuklaView Answer on Stackoverflow
Solution 23 - JavaerdikanikView Answer on Stackoverflow