No matching bean of type ... found for dependency

JavaSpringHibernateSpring MvcAutowired

Java Problem Overview


after some days of trying and waitin' for answers on the springsource forums I'll try it here. Running my application results in these exception:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.example.my.services.user.UserService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
	org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
	org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
	org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
	org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
	org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
	org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
	org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
	org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
	org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
	javax.servlet.GenericServlet.init(GenericServlet.java:212)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)

Here's the relevant code

application context:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="org.postgresql.Driver" />
  <property name="url" value="jdbc:postgresql://localhost:5432/test" />
  <property name="username" value="test" />
  <property name="password" value="test" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="packagesToScan" value="com.example.my.entities.*" />
  <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
  <property name="hibernateProperties">
    <props>
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
      <prop key="hibernate.show_sql">true</prop>
    </props>
  </property>
</bean>

<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>

com.example.my.entities.user:

@Entity
@Table( name = "tbl_users" )
public class User
{
  @Id
  @Column( name = "id" )
  @GeneratedValue
  private int id;

  @Column( name = "username" )
  private String username;

  @Column( name = "password" )
  private String password;

  public void setId( int id )
  {
    this.id = id;
  }

  public int getId()
  {
    return id;
  }

  public void setUsername( String username )
  {
    this.username = username;
  }

  public String getUsername()
  {
    return username;
  }

  public void setPassword( String password )
  {
    this.password = password;
  }

  public String getPassword()
  {
    return password;
  }
}

service:

@Service
public class UserServiceImpl implements UserService
{
  @Autowired
  private UserDAO userDAO;

  @Override
  @Transactional
  public void addUser( User user )
  {
    userDAO.addUser( user );
  }

  @Override
  @Transactional
  public List<User> listUsers()
  {
    return userDAO.listUsers();
  }

  @Override
  @Transactional
  public void removeUser( int id )
  {
    userDAO.removeUser( id );
  }
}

Java Solutions


Solution 1 - Java

Multiple things can cause this, I didn't bother to check your entire repository, so I'm going out on a limb here.

First off, you could be missing an annotation (@Service or @Component) from the implementation of com.example.my.services.user.UserService, if you're using annotations for configuration. If you're using (only) xml, you're probably missing the <bean> -definition for the UserService-implementation.

If you're using annotations and the implementation is annotated correctly, check that the package where the implementation is located in is scanned (check your <context:component-scan base-package= -value).

Solution 2 - Java

Add this to you applicationContext:

 <bean id="userService" class="com.example.my.services.user.UserServiceImpl ">

Solution 3 - Java

Add annotation @Repository to the head of userDao Class.If userDao is a interface,add this annotation to the implements of the interface.

Solution 4 - Java

I have similar trouble in test config, because of using AOP. I added this line of code in spring-config.xml

<aop:config proxy-target-class="true"/>

And it works !

Solution 5 - Java

I had a similar issue but I was missing the (@Service or @Component) from the implementation of com.example.my.services.myUser.MyUserServiceImpl

Solution 6 - Java

IF this is only occurring on deployments, be sure that you have the dependency of the package you are referencing in the .war. For instance, this was working locally on my machine, with debug configurations working fine, but after deploying to Amazon's Elastic Beanstalk , I received this error and noticed one of the dependencies was not bundled in the .war package.

Solution 7 - Java

In my case it was the wrong dependecy for CrudRepository. My IDE added also follwing:

	<dependency>
		<groupId>org.springframework.data</groupId>
		<artifactId>spring-data-commons</artifactId>
		<version>1.11.2.RELEASE</version>
	</dependency>

But I just needed:

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
		<version>RELEASE</version>
	</dependency>

I removed the first one and everything was fine.

Solution 8 - Java

I had the same issue but in my case, implemented class was accidently become 'abstract' as a result autowiring was failing.

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
QuestiondtrunkView Question on Stackoverflow
Solution 1 - JavaesajView Answer on Stackoverflow
Solution 2 - JavaMichael WView Answer on Stackoverflow
Solution 3 - JavarobinwenView Answer on Stackoverflow
Solution 4 - JavaabkvandrdView Answer on Stackoverflow
Solution 5 - JavasreeprasadView Answer on Stackoverflow
Solution 6 - JavamytwocentsView Answer on Stackoverflow
Solution 7 - JavaDOUBL3PView Answer on Stackoverflow
Solution 8 - JavaVinod KumarView Answer on Stackoverflow