【问题标题】:could not autowire spring无法自动装配弹簧
【发布时间】:2016-09-27 03:24:05
【问题描述】:

我正在尝试学习 Spring MVC 并创建了一个休息服务,但我遇到了 bean 自动装配问题。

Could not autowire field: taxApp.dao.daoImpl.userDaoImpl taxApp.controller.loginController.userService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [taxApp.dao.daoImpl.userDaoImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency

我的spring项目的结构是这样的

src
   main
       java
           taxApp
                 controller
                           loginController.java
                 model
                      user.java
                 dao
                    daoImpl
                           userDaoImpl.java
                    userDAO.java
       resources
                database
                        data-source-cfg.xml
                user 
                    spring-user.xml
                spring-module.xml
       webapp
             web-inf
                    dispatcher-servlet.xml
                    web.xml
             index.jsp

以下是文件的样子

dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

  <mvc:annotation-driven/>
  <context:component-scan base-package="taxApp" />
  <context:annotation-config />

  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
      <value>/WEB-INF/pages/</value>
    </property>
    <property name="suffix">
      <value>.jsp</value>
    </property>
  </bean>

</beans>

spring-user.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="userDAO" class="dao.impl.userDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

spring-module.xml

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

  <!-- Using Oracle datasource -->
  <import resource="database/data-source-cfg.xml" />
  <import resource="dao/spring-user.xml" />

</beans>

控制器、DAO、服务和模型等所有其他实现看起来像

loginController.java

@RestController
public class loginController {
    @Autowired
    userDaoImpl userService;  //Service which will do all data retrieval/manipulation work
    //other methods
}

userDAO.java

public interface userDAO {
    public void insert(user _user);
    public user findUserByEmail(String email);
}

userDaoImpl.java

public class userDaoImpl implements userDAO{

    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    //other methods
}

【问题讨论】:

  • 使用@Autowired userDao 代替@Autowired userDaoImpl。程序接口不是具体的类。

标签: java xml spring spring-mvc


【解决方案1】:

将你的 daoimpl 标记为

@存储库 公共类 userDaoImpl 实现 userDAO{}

Autowire 接口而不是标记一个具体的类。 为 Spring 应用程序使用 java config 更容易理解。

【讨论】:

    【解决方案2】:

    您能否更改以下内容:

    @RestController
    public class loginController {
        @Autowired
        userDaoImpl userService;  //Service which will do all data retrieval/manipulation work
        //other methods
    }
    

    通过以下方式:

    @RestController
    public class loginController {
        @Autowired
        @Qualifier("userDAO")
        userDaoImpl userService;  //Service which will do all data retrieval/manipulation work
        //other methods
    }
    

    看看结果?

    【讨论】:

      【解决方案3】:

      你在 bean 中有一个 setter 注入你想自动装配你必须做这样的事情

      //Autowired annotation on variable/setters is equivalent to autowire="byType"
          @Autowired
          private Employee employee;
      
          @Autowired
          public void setEmployee(Employee emp){
              this.employee=emp;
          } 
      

      【讨论】:

        猜你喜欢
        • 2017-10-04
        • 2014-08-30
        • 1970-01-01
        • 2017-11-11
        • 2012-10-18
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        相关资源
        最近更新 更多