0

I'm having a bad time trying to run my program using Spring @Autowired annotation. Just to explain you what I'm trying to do, I have a main controller class, MainController, that always uses two other classes (SquadraController class and UserController class) to do some work.

Instead of instantiating these classes any time I need them, I decided to declare them as instance variables with the @Autowired annotation and call them any time I need them.

So I have my instance variables with @Autowired annotation and declared the beans in the context xml file, but I get the following error and I can't get out of it:

20/03/2015 15:10:00 - WARN  - (AbstractApplicationContext.java:487) - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mainController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.fabrizio.fantavalcanneto.controller.UserController org.fabrizio.fantavalcanneto.controller.MainController.userController; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.fabrizio.fantavalcanneto.controller.UserController] 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)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)

This is my MainController class (the snippet that raises the error):

@Controller
public class MainController {

    private static final Logger logger = LoggerFactory.getLogger(MainController.class);

    @Autowired
    private UserController userController;

    @Autowired
    private SquadraController squadraController;

This is the xml file where I declare my beans (I also tried to declare MainController bean without declaring the instance variables as properties):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="

http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd">


 <context:component-scan base-package="org.fabrizio.fantavalcanneto.controller" />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

 <bean 
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

 <bean id="userController" class="org.fabrizio.fantavalcanneto.controller.UserController" >
 </bean>

 <bean id="mainController" class="org.fabrizio.fantavalcanneto.controller.MainController">
 <property name="userController" value="userController"></property>
 <property name="squadraController" value="squadraController"></property>
 </bean>

 <bean id="squadraController" class="org.fabrizio.fantavalcanneto.controller.SquadraController">
 </bean>
</beans>

UserController and SquadraController have no instance variables.

lateralus
  • 1,020
  • 1
  • 12
  • 35

1 Answers1

0

If you are context component scanning you don't need to define the beans in the config file, something like this will work. All you need is @Controller annoation on the relevant classes :

    <context:component-scan base-package="org.fabrizio.fantavalcanneto.controller" />
    // for default converters etc add this aswell 
    <mvc:annotation-driven/>

Just check you have the correct base package/typos

NimChimpsky
  • 46,453
  • 60
  • 198
  • 311
  • That is my springmvc-servlet.xml file! – lateralus Mar 20 '15 at 14:31
  • @lateralus oh. Well you don;t need to manually define the controllers if you are component scanning ... remove that to start with – NimChimpsky Mar 20 '15 at 14:32
  • Ok so i definitely don't need to declare them as beans, and I don't think I need to use the @Bean notation too, right? – lateralus Mar 20 '15 at 14:44
  • `@Controller` annotation makes it a candidate for a component scan – S. Pauk Mar 20 '15 at 14:53
  • I didn't declare them as @Controller as they don't catch requestMappings, I did put them in the controller package because these are "helpers" for the Main controller that is the one that dispatches requests. It's like a service layer. – lateralus Mar 20 '15 at 15:13
  • 1
    @lateralus Annotate them at least with `@Component` (or `@Service` if they really are service classes) and try again. – Predrag Maric Mar 20 '15 at 16:18
  • Like this it's working fine, thanks. I'm going to learn something more about these annotations now. – lateralus Mar 20 '15 at 16:31