skip to Main Content

I was trying for CRUD services using springboot with mongodb.

Getting error while running main application.

ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'productController': Unsatisfied dependency expressed through field 'productServiceImpl'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.cts.eaution.impl.ProductServiceImpl' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Controller class :

@RestController
@RequestMapping("/e-auction/api/v1/seller/")
public class ProductController {
    
    @Autowired
    public ProductServiceImpl productServiceImpl;
    
/*  @Autowired
    public ProductRepository productRepository;
    */
    @GetMapping("/show-bids")
    public List<Product> getAllProducts() {
        System.out.println("Hello Product...");
        return productServiceImpl.findAll();
        //return productRepository.findAll();
    }
    
    
}

ServiceImpl class :

class ProductServiceImpl implements ProductService {
    
    @Autowired
    private ProductRepository productRepository;

    @Override
    public List<Product> findAll() {
        return productRepository.findAll();
    }

}

Service interface :

@Service
public interface ProductService {
    
    List<Product> findAll();

}

Repository interface :

public interface ProductRepository extends MongoRepository<Product, String> {

}

Pom xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!-- <version>2.7.5</version> -->
        <version>2.6.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cts</groupId>
    <artifactId>eauction</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eauction</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

I tried multiple option by adding annotation like (service, repository, component, componentscan) non of this solve the problem.

application properties :
#server
server.port=8082

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=productdb 

Full Error logs :

Error creating bean with name 'productController': Unsatisfied dependency expressed through field 'productService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'productServiceImpl': Unsatisfied dependency expressed through field 'productRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productRepository' defined in com.cts.eauction.repository.ProductRepository defined in @EnableMongoRepositories declared on MongoRepositoriesRegistrar.EnableMongoRepositoriesConfiguration: Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mongoTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryDependentConfiguration.class]: Unsatisfied dependency expressed through method 'mongoTemplate' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoDatabaseFactory' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.mongodb.core.MongoDatabaseFactorySupport]: Factory method 'mongoDatabaseFactory' threw exception; nested exception is java.lang.IllegalArgumentException: Database name must not contain slashes, dots, spaces, quotes, or dollar signs!

2

Answers


  1. You have to place the @Service annotation on the implementation and not on the interface in order to make it autodetected by the component scan. Like this:

    @Service
    class ProductServiceImpl implements ProductService {
        
        @Autowired
        private ProductRepository productRepository;
    
        @Override
        public List<Product> findAll() {
            return productRepository.findAll();
        }
    
    }
    

    Also you should ask for a bean of the interface type and not the implementation in your controller:

    @RestController
    @RequestMapping("/e-auction/api/v1/seller/")
    public class ProductController {
        
        @Autowired
        public ProductService productService;
    }
    

    This way you can have different implementations of the same interface, also you should not use field injection unless you have a good reason to use it.

    Login or Signup to reply.
  2. If the above solution didn’t work then another way you can try is by putting –

    @ComponentScan(basePackages = {"com.package.class", "com.package.anotherClass"}) 
    

    in your main application class.

    This will scan all your classes present inside the packages.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search