Reputation: 167
I have the following code structure of my Springboot Application:
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
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
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
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