BeanNotOfRequiredTypeException

我还是Spring MVC的新手,在构建我的测试项目时,我从Tomcat日志中收到了这条消息:

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) 

我为用户和管理员提供了两个rolle服务:

 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 & 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 findAllDivisions(); public List findDivisionsByName(EmployeeDiv division); public EmployeeDiv findDivisionsById(Integer id); /* * Login */ public UserInfo registerUser(UserInfo user); public UserInfo updateUser(UserInfo user); public List findAllUsesrs(); public List findUsesrByLogin(UserInfo user); public UserInfo findUsesrById(Integer id); } 

这是AdminServiceImpl:

 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 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 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 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 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; } } 

这是applicationContext.xml

                  employee.model.UserInfo employee.model.EmployeeInfo employee.model.EmployeeDiv     org.hibernate.dialect.MySQLDialect true update               

请告诉我这个bean名称有什么问题,我明白这是AOP问题:

 Bean named 'adminService' must be of type [employee.service.impl.AdminServiceImpl], but was actually of type [$Proxy52] 

我该怎么办呢?

我在控制器中使用AdminServiceImpl:

 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"; } .... 

在代码中的某处,您必须像这样自动assemblyAdminServiceImpl

 @Autowired private AdminServiceImpl adminService; 

要么勉强依赖于界面:

 @Autowired private AdminService adminService; 

或启用CGLIB代理。

类似的问题

  • 自动assembly的spring bean不是代理
  • 在非单例bean上修复Spring代理上的BeanNotOfRequiredTypeException?
  • 获取Spring错误“Bean命名为’x’必须是[y]类型,但实际上是Jenkins类型[$ Proxy]”
  • 在Spring AOP介绍中丢失了原始界面

使用接口AdminService而不是实现。

由Annotation @Transactional引起的这个错误, SpringRuntimeAdminService提供代理。

当您的服务类实现某个接口时,默认情况下spring会接受JDK的代理,这就是您收到该错误的原因,因此无论是通过接口使用@Autowired还是启用CGLIB代理 ,您都可以解决该问题。

我解决了在我的spring应用程序上下文中使用proxy-target-class属性启用CGLIB代理的问题

  

我遇到了同样的问题,但我通过以下解决方法解决了问题:

请用接口替换您的实现类。 例如:

 class Abc { @Autowire private Boy boy // remove @BoyImpl ............. ................... } 

当我在谷歌搜索我的问题时,我发现了许多与此类似的问题。 但是,就我而言,我已经使用了一个界面。 所以我认为这可能对其他人有所帮助:

如果您有两个具有相同名称的bean,也可能出现此exception!

在我的情况下,我在applicationContext.xml中有额外的bean配置。 合并两个应用程序后出现问题。 第二个定义了一个@Resource ,它的成员变量名称与上面提到的第一个应用程序的bean名称相匹配。 当然,第一个应用程序的bean配置不适合第二个应用程序通过@Resource包含的bean。