创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段

Posted

技术标签:

【中文标题】创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段【英文标题】:Error creating bean.Injection of autowired dependencies failed.Could not autowire field 【发布时间】:2015-12-11 07:05:12 【问题描述】:

我在 Spring + Spring MVC + Hibernate + mysql Web 应用程序中的 Spring 配置有问题。Spring 无法创建我在 Service 类中宣布的 bean。

这里是控制器类

@Controller
@RequestMapping("/main")
public class MainController 

private static Logger LOGGER = Logger.getLogger("Controller");

@Autowired
private PersonServiceImpl personServiceImpl;

@Autowired
private ActionServiceImpl actionServiceImpl;



@RequestMapping(value = "/users" , method = RequestMethod.GET)
public String getUsers(Model model) 

    LOGGER.debug("Receive request for show all users");
    List<User> users = personServiceImpl.getAll();
    model.addAttribute("users", users);
    return "userspage";



@RequestMapping(value = "/users/add", method = RequestMethod.GET)
public String getAdd() 

    LOGGER.debug("Receive request to show add page");
    return "addpage";



@RequestMapping(value = "/users/add", method = RequestMethod.POST)
public String add(@ModelAttribute("userAttribute") User user,Actions 
actions) 

    LOGGER.debug("Recieve request to add a new user");
    personServiceImpl.add(user);
    actionServiceImpl.addAction(user.getId(), actions);
    return "addedpage";



@RequestMapping(value = "/users/delete", method = RequestMethod.GET)
public String delete(@RequestParam(value = "id", required = true)Integer 
id, Model model) 

    LOGGER.debug("Recieve request for deleting user");
    personServiceImpl.delete(id);
    model.addAttribute("id", id);
    return "deletedpage";



@RequestMapping(value = "/users/edit", method = RequestMethod.GET)
public String getEdit(@RequestParam(value = "id", required = true)Integer 
id, Model model) 

    LOGGER.debug("Recieve request to show editpage");
    model.addAttribute("userAttribute", personServiceImpl.get(id));
    return "editpage";



@RequestMapping(value = "/users/edit", method = RequestMethod.POST)
public String saveEdit(@ModelAttribute("userAttribute") User user,
                       @RequestParam(value = "id", required = 
true)Integer id, Model model,
                       Actions actions) 

    LOGGER.debug("Received request to update person");
    user.setId(id);
    personServiceImpl.edit(user);
    actionServiceImpl.editAction( id, actions);
    model.addAttribute("id", id);
    return "editedpage";



@RequestMapping(value = "/users/actions", method = RequestMethod.GET)
public String getActionsOfUser(@RequestParam(value = "id", required = 
true)Integer id, Model model,

    LOGGER.debug("Recieve request to show user Action");
    model.addAttribute("userId", personServiceImpl.get(id));
    model.addAttribute("userAction", 
actionServiceImpl.getListOfActions(user));
    return "userActionsPage";



这里是服务接口

public interface ActionService 

List<Actions> getListOfActions(User user);

void addAction(Integer id, Actions actions);

void editAction(Integer id, Actions actions);





public interface PersonService 

List<User> getAll();

User get(Integer id);

void add(User user);

void delete(Integer id);

void edit(User user);


他们的实现

@Service
@Transactional
public class ActionServiceImpl implements ActionService 

private static Logger LOGGER = Logger.getLogger("actionService");

@Autowired
private SessionFactory sessionFactory;

@Bean
ActionService getActionService() 
    return new ActionServiceImpl();


public List<Actions> getListOfActions(User user)

    LOGGER.debug("Retriving all user actions");
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("from Actions where  user = " +    
user.getId());
    return query.list();


public void addAction(Integer id, Actions actions)

    LOGGER.debug("Adding addAction to user info");
    Session session = sessionFactory.getCurrentSession();
    actions.setActionType(ActionType.ADDING_NEW_USER);
    actions.setDate(new Date());
    User existingUser = (User) session.get(User.class , id);
    actions.setUser(existingUser);
    existingUser.getActions().add(actions);
    session.save(existingUser);
    session.save(actions);



public void editAction(Integer id, Actions actions)

    LOGGER.debug("Adding editAction to user info");
    Session session = sessionFactory.getCurrentSession();
    actions.setActionType(ActionType.EDITING_EXISTING_USER);
    actions.setDate(new Date());
    User existingUser = (User) session.get(User.class , id);
    actions.setUser(existingUser);
    existingUser.getActions().add(actions);
    session.save(existingUser);
    session.save(actions);





@Service
@Transactional
public class PersonServiceImpl implements  PersonService

private static Logger LOGGER = Logger.getLogger("service");

@Autowired
private SessionFactory sessionFactory;

@Bean
PersonService getPersonService() 
    return new PersonServiceImpl();


public List<User> getAll() 

    LOGGER.debug("Retrieving all users");
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("from User ");
    return query.list();



public User get(Integer id) 

    Session session = sessionFactory.getCurrentSession();
    User user = (User) session.get(User.class, id);
    return user;



public void add(User user) 

    LOGGER.debug("Adding new user");
    Session session = sessionFactory.getCurrentSession();
    session.save(user);


public void delete(Integer id) 

    LOGGER.debug("Deleting existing user");
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("from User where id = " + id);
    User user = (User) query.uniqueResult();
    List<Actions> actions = user.getActions();
    session.delete(user);
    for(Actions actionses: actions )
        session.delete(actionses);
    



public void edit(User user) 

    LOGGER.debug("Editing existing user");
    Session session = sessionFactory.getCurrentSession();
    User existingUser = (User) session.get(User.class, user.getId());
    existingUser.setLogin(user.getLogin());
    existingUser.setPassword(user.getPassword());
    existingUser.setReal_name(user.getReal_name());
    session.save(existingUser);


应用程序上下文

<?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: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.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-  
3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<!-- Activates various annotations to be detected in bean classes -->
<context:annotation-config />

<!-- Scans the classpath for annotated components that will be  
auto-registered as Spring beans.
 For example @Controller and @Service.-->

<context:component-scan base-package="com.oleg.project.*" />

<!-- Configures the annotation-driven Spring MVC Controller programming 
model.-->
<mvc:annotation-driven />

<!-- Load Hibernate related configuration -->
<import resource="hibernate-context.xml" />

</beans>

最后是我的 StackTrace

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 com.oleg.project.Services.PersonServiceImpl com.oleg.project.Controller.MainController.personServiceImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.oleg.project.Services.PersonServiceImpl] 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:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5016)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5528)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1809)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:618)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:565)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1471)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1312)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1404)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:832)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$79(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.oleg.project.Services.PersonServiceImpl com.oleg.project.Controller.MainController.personServiceImpl;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [com.oleg.project.Services.PersonServiceImpl] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:571) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 58 更多 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖找到[com.oleg.project.Services.PersonServiceImpl]类型的合格bean:预计至少有1个bean有资格作为此依赖的自动装配候选者。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1326) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1072) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:967) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:543) ... 60 更多

【问题讨论】:

您正在使用接口但正在对具体类进行编程,不要那样做,使用接口。而不是private PersonServiceImpl personServiceImpl; 使用private PersonService personService。这就是使用接口的全部意义所在。 并去掉@Bean注解的方法。没用。 @M.Deinum 这应该是一个答案。 你能把&lt;context:component-scan base-package="com.oleg.project.*" /&gt;换成&lt;context:component-scan base-package="com.oleg.project" /&gt;吗? 谢谢@M。 Deinum 和 JB Nizet。这是最好的 【参考方案1】:

您的服务定义如下。

@Service
@Transactional
public class ActionServiceImpl implements ActionService  ... 

现在发生的情况是由于配置中的&lt;context:component-scan /&gt;,Spring 将创建ActionServiceImpl 的实例。您还有一个&lt;tx:annotation-driven /&gt;,它检测@Transactional 并创建一个动态代理(一个不错的$proxy12 类或类似的东西)。此代理仅实现接口,因此是ActionService,但不是ActionServiceImpl

要应用 AOP,spring 使用代理,当涉及接口时,它默认使用仅作为接口的 JDK 动态代理。

要解决您的问题,您可以做 2 件事中的 1 件事

    private PersonServiceImpl personServiceImpl; 更改为private PersonService personService;。 通过在元素上指定 proxy-target-class="true" 来强制使用基于类的代理 &lt;tx:annotation-driven /&gt;

专业提示

    &lt;context:annotation-config /&gt; 已经隐含在使用 &lt;context:component-scan /&gt; 时,您可以删除该行。 base-package 是它声明一个不带表达式的基本包,将 com.oleg.project.* 更改为 om.oleg.project。 您的服务中的 @Bean 方法除了杂乱之外不会添加任何内容,请将其删除以清理您的代码。

【讨论】:

以上是关于创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段的主要内容,如果未能解决你的问题,请参考以下文章

创建名为“homeController”的 bean 时出错:自动装配依赖项的注入失败

Spring data jpa-未定义名为“entityManagerFactory”的bean;注入自动装配的依赖项失败

beans.factory.BeanCreationException:创建名为“dao”的bean时出错:注入持久性依赖项失败

具有自动装配的字段但得到无法自动装配字段消息

春季项目出错,休眠

NoSuchBeanDefinitionException:没有合格的 bean