Prashant
Prashant

Reputation: 167

Spring-boot CrudRepository autowiring error

I have the following code structure of my Springboot Application:

structure

I am getting exception of NoSuchBeanDefinitionException for bean UserDao .

Exception Trace :

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.matlb.dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotat`enter code here`ion.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    ... 37 common frames omitted

The source code of UserDao.java interface is

package com.matlb.dao;

import com.matlb.domain.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserDao extends CrudRepository<User,Integer>{

    User findByEmail(String email);
}

and I am autowiring it here

package com.matlb.service;

import com.matlb.dao.UserDao;
import com.matlb.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> findAll() {
        return (List<User>) getUserDao().findAll();
    }

    @Override
    public User createUser(String email) {
        User user = new User(email);
        return saveUser(user);
    }

    @Override
    public User findById(Integer userId) {
        return getUserDao().findOne(userId);
    }

    @Override
    public User saveUser(User user) {
        return getUserDao().save(user);
    }

    @Override
    public User findByEmail(String email) {
        return getUserDao().findByEmail(email);
    }

    @Override
    public void delete(Integer userId) {
        getUserDao().delete(userId);
    }

    public UserDao getUserDao() {
        return userDao;
    }
}

Source of Main class

package com.matlb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
public class MatlbApplication {

    public static void main(String[] args) {
        SpringApplication.run(MatlbApplication.class, args);
    }
}

build.gradle

buildscript {
    ext {
        springBootVersion = '1.3.3.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.springframework:springloaded:1.2.1.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot' 

jar {
    baseName = 'demo'
    version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-aop')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile("org.springframework.boot:spring-boot-devtools")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    runtime('mysql:mysql-connector-java')
    testCompile('org.springframework.boot:spring-boot-starter-test') 
    testCompile('org.springframework.restdocs:spring-restdocs-mockmvc')
}

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.9'
}

Please let me know where I'm doing it wrong . I'm using Intellij as IDE and its showing bean as created when I use the @Repository annotation.

Upvotes: 6

Views: 9602

Answers (3)

Meena Chaudhary
Meena Chaudhary

Reputation: 10695

@Daniel has already given good background on how Spring Data wires repositories.

As for debugging, for some reason Spring do not show any error when failing to initialize the repository extended from CrudRepository. To debug, change the extended class from CrudRepository to JpaRepository. Now Spring will show why it is not able to initialize the repository(In my case it was the entity not mapped to table correctly). Once these errors are fixed and you can switch back to CrudRepository. And it will work. It worked for me.

Upvotes: 0

Saravanan
Saravanan

Reputation: 161

Name and place the packages correctly, com.app - SpringBootApplication com.app.controller - Controller class com.app.repo - Repo class exdends CrudRepository com.app.model - Your table class(Entity)

Upvotes: 0

Daniel Lavoie
Daniel Lavoie

Reputation: 1922

First of all, you need to remove @Repository from your DAO interface. Spring Data JPA will build the implementation and deploy it in the Spring container without the @Repository. It is the @EnableJpaRepository that will give the instruction to String Data Jpa. Spring Boot autoconfiguration will declare the @EnableJpaRepository`for you.

Then, replace CrudRepository by JpaRepository.

Finally, make sure you have declared spring-boot-starter-data-jpa as a maven dependency.

Regards, Daniel

Upvotes: 11

Related Questions