title: BeanNotOfRequiredTypeException due to autowired fields
body: <p>I'm still new to Spring MVC and while building my test project, I got this message from Tomcat logs:</p>
  
  <pre><code>SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'divisionController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'adminService' must be of type [employee.service.impl.AdminServiceImpl], but was actually of type [$Proxy52]
      at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:307)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
      ...
  Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'adminService' must be of type [employee.service.impl.AdminServiceImpl], but was actually of type [$Proxy52]
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:360)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
  </code></pre>
  
  <p>I have two rolle services for user and admin with there interfaces:</p>
  
  <pre><code>package employee.service;
  
  import employee.model.EmployeeDiv;
  import employee.model.EmployeeInfo;
  import employee.model.UserInfo;
  
  import java.util.List;
  
  /**
   *
   * @author serge
   */
  
  public interface AdminService extends UserService {
  
       //  !!!! for register &amp; udate of Employee use String type birthday !!!!
  
      /*
       * Employee
       */
      public EmployeeInfo registerEmployee(EmployeeInfo employeeInfo);
  
      public EmployeeInfo updateEmployee(EmployeeInfo employeeInfo);
  
      public EmployeeInfo findEmployeeByID(Integer id);   
  
      /*
       * Division
       */
      public EmployeeDiv registerDivision(EmployeeDiv division);
  
      public EmployeeDiv updateDivision(EmployeeDiv division);
  
      public List&lt;EmployeeDiv&gt; findAllDivisions();
  
      public List&lt;EmployeeDiv&gt; findDivisionsByName(EmployeeDiv division);
  
      public EmployeeDiv findDivisionsById(Integer id);
  
      /*
       * Login
       */
      public UserInfo registerUser(UserInfo user);
  
      public UserInfo updateUser(UserInfo user);
  
      public List&lt;UserInfo&gt; findAllUsesrs();
  
      public List&lt;UserInfo&gt; findUsesrByLogin(UserInfo user);
  
      public UserInfo findUsesrById(Integer id);
  }
  </code></pre>
  
  <p>This is AdminServiceImpl:</p>
  
  <pre><code>package employee.service.impl;
  
  import employee.DAO.EmployeeDivDAO;
  import employee.DAO.EmployeeInfoDAO;
  import employee.DAO.UserDAO;
  import employee.model.EmployeeDiv;
  import employee.model.EmployeeInfo;
  import employee.model.UserInfo;
  import employee.service.AdminService;
  import employee.validation.ParsingDate;
  import org.apache.log4j.Logger;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.security.access.annotation.Secured;
  import org.springframework.stereotype.Service;
  import org.springframework.transaction.annotation.Transactional;
  
  import java.util.List;
  
  /**
   * @author serge
   *
   * Admin level
   *
   * Service for processing employee, divisions, userslogin
   */
  
  //@Repository("adminService")
  @Service("adminService")
  @Transactional
  public class AdminServiceImpl extends UserServiceImpl implements AdminService {
  
      protected static Logger adminLogger = Logger.getLogger("service");
      private EmployeeDivDAO emplDivDAO;
      private UserDAO userDAO;
      private EmployeeInfoDAO emplInfoDAO;
  
      @Autowired
      @Override
      public void setEmployeeDao(EmployeeInfoDAO emplInfoDAO) {
          this.emplInfoDAO = emplInfoDAO;
      }
  
      @Autowired
      public void setEmployeeDao(EmployeeDivDAO emplDivDAO) {
          this.emplDivDAO = emplDivDAO;
      }
  
      @Autowired
      public void setUserDao(UserDAO userDAO) {
          this.userDAO = userDAO;
      }
  
      public AdminServiceImpl() {
  
          initTestEmployee();
      }
  
      /**
       * Initialize EmployeeInfo test
       */
      @Transactional
      @Secured("ROLE_ADMIN")
      private EmployeeInfo initTestEmployee() {
  
          adminLogger.debug("saving testEmployee");
  
          EmployeeInfo employeeInfo = new EmployeeInfo();
          ParsingDate date = new ParsingDate();
          employeeInfo.setFirstName("Petr");
          employeeInfo.setLastName("Ivanenko");
          employeeInfo.setEmpDiv("second");
          employeeInfo.setBirthdate(date.parseDate("1981-10-03"));
          employeeInfo.setSalary(3500);
          employeeInfo.setActive(true);
  
          return employeeInfo;
      }
  
      /**
       * registrating new Employee Information
       *
       * @return EmployeeInfo object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public EmployeeInfo registerEmployee(EmployeeInfo employeeInfo) {
  
          adminLogger.debug("registrating new Employee");
  
          try {
  
              emplInfoDAO.save(employeeInfo);
  
          } catch (NullPointerException e) {
          }
          return employeeInfo;
      }
  
      /**
       * updating Employee Information
       *
       * @return EmployeeInfo object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public EmployeeInfo updateEmployee(EmployeeInfo employeeInfo) {
  
          adminLogger.debug("updating Employee with id: " + employeeInfo.getId());
          try {
  
              emplInfoDAO.update(employeeInfo);
  
          } catch (NullPointerException e) {
          }
          return employeeInfo;
      }
  
      /**
       * Retrieving Employee Information by id 
       *
       * @return EmployeeInfo object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public EmployeeInfo findEmployeeByID(Integer id) {
  
          adminLogger.debug("Retrieving Employee with id= " + id);
          EmployeeInfo employeeInfo = new EmployeeInfo();
          employeeInfo.setId(id);
          emplInfoDAO.find(employeeInfo);
          return employeeInfo;
      }
  
      /**
       * registrating new Employee Division
       *
       * @return EmployeeDiv object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public EmployeeDiv registerDivision(EmployeeDiv division) {
  
          adminLogger.debug("registrating new Division");
          try {
  
              emplDivDAO.save(division);
  
          } catch (NullPointerException e) {
          }
          return division;
      }
  
      /**
       * updating Employee Division
       *
       * @return EmployeeDiv object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public EmployeeDiv updateDivision(EmployeeDiv division) {
  
          adminLogger.debug("updating Division with id: " + division.getId());
          try {
  
              emplDivDAO.update(division);
  
          } catch (NullPointerException e) {
          }
          return division;
      }
  
      /**
       * Retrieving all Employee Divisions
       *
       * @return List of EmployeeDiv objects
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public List&lt;EmployeeDiv&gt; findAllDivisions() {
  
          adminLogger.debug("Retrieving all divisions");
          return emplDivDAO.findAll();
      }
  
      /**
       * Retrieving all Employee Divisions by name
       *
       * @return List of EmployeeDiv objects
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public List&lt;EmployeeDiv&gt; findDivisionsByName(EmployeeDiv division) {
          String empDiv = "empDiv";
  
          adminLogger.debug("Retrieving Divisions by name: " + division.getEmpDiv());
          return emplDivDAO.findAllByParam(empDiv, division.getEmpDiv());
      }
  
       /**
       * Retrieving Employee Divisions by id 
       *
       * @return EmployeeDiv object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public EmployeeDiv findDivisionsById(Integer id) {
  
          adminLogger.debug("Retrieving Division with id= " + id);
          EmployeeDiv employeeDiv = new EmployeeDiv();
          employeeDiv.setId(id);
          emplInfoDAO.find(employeeDiv);
          return employeeDiv;
      }
  
      /**
       * registrating new User Information
       *
       * @return UserInfo object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public UserInfo registerUser(UserInfo user) {
  
          adminLogger.debug("registrating new User");
          try {
  
              userDAO.save(user);
  
          } catch (NullPointerException e) {
          }
          return user;
      }
  
      /**
       * updating new User Information
       *
       * @return UserInfo object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public UserInfo updateUser(UserInfo user) {
  
          adminLogger.debug("updating User with id: " + user.getId());
          try {
  
              userDAO.update(user);
  
          } catch (NullPointerException e) {
          }
          return user;
      }
  
      /**
       * retriviting all Users 
       *
       * @return List of UserInfo objects
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public List&lt;UserInfo&gt; findAllUsesrs() {
  
          adminLogger.debug("Retrieving all Users");
          return userDAO.findAll();
      }
  
      /**
       * retriving all Users by login
       *
       * @return List of UserInfo objects
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public List&lt;UserInfo&gt; findUsesrByLogin(UserInfo user) {
          String login = "login";
  
          adminLogger.debug("Retrieving User with login: " + login);
          return userDAO.findAllByParam(login, user.getLogin());
      }
  
      /**
       * Retrieving Employee Divisions by id 
       *
       * @return EmployeeDiv object
       */
      @Override
      @Transactional
      @Secured("ROLE_ADMIN")
      public UserInfo findUsesrById(Integer id) {
  
          adminLogger.debug("Retrieving Division with id= " + id);
          UserInfo userInfo = new UserInfo();
          userInfo.setId(id);
          emplInfoDAO.find(userInfo);
          return userInfo;
      }
  }
  </code></pre>
  
  <p>This is applicationContext.xml</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  
  &lt;beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:context="http://www.springframework.org/schema/context"
         xmlns:mvc="http://www.springframework.org/schema/mvc"
         xsi:schemaLocation="http://www.springframework.org/schema/beans 
              http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
              http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context-3.1.xsd
              http://www.springframework.org/schema/mvc 
              http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"&gt;
  
      &lt;!-- Activates annotations --&gt;
  
      &lt;context:annotation-config /&gt;
  
      &lt;!-- Scans for annotated components in base-package--&gt;
  
      &lt;context:component-scan base-package="employee" /&gt;
  
      &lt;bean class="employee.service.impl.AdminServiceImpl"/&gt;
      &lt;bean class="employee.service.impl.UserServiceImpl"/&gt;
      &lt;!--bean class="employee.DAO.impl.EmployeeInfoDAOImpl"/&gt;
      &lt;bean class="employee.DAO.impl.EmployeeDivDAOImpl"/&gt;
      &lt;bean class="employee.DAO.impl.UserDAOImpl"/--&gt;
  
      &lt;!-- for Spring Jackson JSON support  --&gt;
  
      &lt;mvc:annotation-driven/&gt;
  
      &lt;!-- Shared Hibernate SessionFactory in a Spring application context. --&gt;
  
      &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&gt;
          &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;
  
          &lt;!--property name="dataSource"&gt;
              &lt;ref bean="dataSource"/&gt;
          &lt;/property--&gt;
  
          &lt;property name="annotatedClasses"&gt;
              &lt;list&gt;
                  &lt;value&gt;employee.model.UserInfo&lt;/value&gt;
                  &lt;value&gt;employee.model.EmployeeInfo&lt;/value&gt;
                  &lt;value&gt;employee.model.EmployeeDiv&lt;/value&gt;
              &lt;/list&gt;
          &lt;/property&gt;
  
          &lt;property name="hibernateProperties"&gt;
              &lt;props&gt;
                  &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;
                  &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;
                  &lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt;
              &lt;/props&gt;
          &lt;/property&gt;
      &lt;/bean&gt;
  
      &lt;!-- for database, imports the properties from database.properties --&gt;
  
      &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;
          &lt;property name="driverClassName" value="${jdbc.driverClassName}" /&gt;
          &lt;property name="url" value="${jdbc.url}" /&gt;
          &lt;property name="username" value="${jdbc.username}" /&gt;
          &lt;property name="password" value="${jdbc.password}" /&gt;
      &lt;/bean&gt;
  
      &lt;bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;
          &lt;property name="location" value="classpath:database.properties"/&gt;
      &lt;/bean&gt;
  &lt;/beans&gt;
  </code></pre>
  
  <p><strong>Please tell me what is the problem with this bean name, I understand that is AOP problem:</strong></p>
  
  <pre><code>Bean named 'adminService' must be of type [employee.service.impl.AdminServiceImpl], but was actually of type [$Proxy52]
  </code></pre>
  
  <p><strong>how I can fix it?</strong></p>
  
  <p>I use AdminServiceImpl in Controllers:</p>
  
  <pre><code>package employee.controller;
  
  import employee.model.EmployeeDiv;
  import employee.service.impl.AdminServiceImpl;
  import org.apache.log4j.Logger;
  import org.springframework.stereotype.Controller;
  import org.springframework.ui.Model;
  import org.springframework.web.bind.annotation.ModelAttribute;
  import org.springframework.web.bind.annotation.PathVariable;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestMethod;
  
  import javax.annotation.Resource;
  
  /**
   * @author serge
   *
   * Handles and retrieves division related requests
   */
  @Controller
  @RequestMapping("/division")
  public class DivisionController {
  
      protected static Logger logger = Logger.getLogger("controller");
      @Resource(name = "adminService")
      private AdminServiceImpl adminService;
  
      /**
       * Handles and retrieves a /WEB-INF/jsp/divisionpage.jsp
       *
       * containing all division
       *
       * @return the name of the JSP page
       */
      @RequestMapping(method = RequestMethod.GET)
      public String getAllPage(Model model) {
          logger.debug("Received request to show all division page");
  
          // Retrieve all division and attach to model 
          model.addAttribute("division", adminService.findAllDivisions());
          return "divisionpage";
      } ....
  </code></pre>