org.springframework.beans.factory.BeanCreationException:嵌套异常是org.springframework.beans.factory.BeanCreationException

时间:2015-05-04 09:31:23

标签: java spring maven spring-mvc

我是spring MVC的新手,我正在尝试使用带有spring框架和注释的MVC创建Contact Manager应用程序。在运行时我得到org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed异常。我已经搜索了很多但是我很困惑这个异常的确切原因。

我发现的解决方案:

  1. 缺少依赖关系 - 我检查了所有依赖项
  2. 不同版本 - 它由Spring框架本身生成,所以我猜它正确
  3. base-package scan-我提供了要扫描的基础包。
  4. 请帮助我。

    1. 任何机构都可以解释我为什么会得到这个例外?
    2. 我的代码有什么问题我得到了这个例外?。
    3. 请帮我解决这个问题。自从过去3天以后我就被困住了。

      栈跟踪

      13:15:41,769 INFO  [STDOUT] ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed
      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.varun.contact.dao.ContactDao com.varun.contact.controller.HomeController.contactDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.varun.contact.dao.ContactDao] 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:287)
          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)
          at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
          at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
          at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
          at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
          at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
          at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
          at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
          at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
          at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
          at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
          at javax.servlet.GenericServlet.init(GenericServlet.java:212)
          at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
          at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:950)
          at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4122)
          at org.apache.catalina.core.StandardContext.start(StandardContext.java:4421)
          at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
          at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
          at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
          at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
          at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
          at java.lang.reflect.Method.invoke(Unknown Source)
          at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
          at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
          at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
          at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
          at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
          at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
          at com.sun.proxy.$Proxy39.start(Unknown Source)
          at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
          at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
          at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
          at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
          at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
          at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
          at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
          at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
          at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
          at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
          at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
          at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
          at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
          at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
          at org.jboss.system.ServiceController.start(ServiceController.java:460)
          at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
          at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
          at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
          at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
          at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
          at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
          at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
          at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
          at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
          at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
          at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
          at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
          at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
          at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
          at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
          at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
          at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
          at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
          at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
          at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
          at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:362)
          at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:255)
          at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
          at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
          at java.util.concurrent.ScheduledThreadPoolExecut
      13:15:41,770 INFO  [STDOUT] or$ScheduledFutureTask.access$301(Unknown Source)
          at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
          at java.lang.Thread.run(Unknown Source)
      

      的pom.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.varun</groupId>
          <artifactId>contact</artifactId>
          <name>Contact</name>
          <packaging>war</packaging>
          <version>1.0.0-BUILD-SNAPSHOT</version>
          <properties>
              <java-version>1.6</java-version>
              <org.springframework-version>3.1.1.RELEASE</org.springframework-version>
              <org.aspectj-version>1.6.10</org.aspectj-version>
              <org.slf4j-version>1.6.6</org.slf4j-version>
          </properties>
          <dependencies>
              <!-- Spring -->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-context</artifactId>
                  <version>${org.springframework-version}</version>
                  <exclusions>
                      <!-- Exclude Commons Logging in favor of SLF4j -->
                      <exclusion>
                          <groupId>commons-logging</groupId>
                          <artifactId>commons-logging</artifactId>
                       </exclusion>
                  </exclusions>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>${org.springframework-version}</version>
              </dependency>
      
              <!-- jdbc template -->
                <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-jdbc</artifactId>
                  <version>${org.springframework-version}</version>
              </dependency>
      
      
              <!-- AspectJ -->
              <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjrt</artifactId>
                  <version>${org.aspectj-version}</version>
              </dependency>   
              <!-- Logging -->
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-api</artifactId>
                  <version>${org.slf4j-version}</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>jcl-over-slf4j</artifactId>
                  <version>${org.slf4j-version}</version>
                  <scope>runtime</scope>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
                  <version>${org.slf4j-version}</version>
                  <scope>runtime</scope>
              </dependency>
              <dependency>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
                  <version>1.2.15</version>
                  <exclusions>
                      <exclusion>
                          <groupId>javax.mail</groupId>
                          <artifactId>mail</artifactId>
                      </exclusion>
                      <exclusion>
                          <groupId>javax.jms</groupId>
                          <artifactId>jms</artifactId>
                      </exclusion>
                      <exclusion>
                          <groupId>com.sun.jdmk</groupId>
                          <artifactId>jmxtools</artifactId>
                      </exclusion>
                      <exclusion>
                          <groupId>com.sun.jmx</groupId>
                          <artifactId>jmxri</artifactId>
                      </exclusion>
                  </exclusions>
                  <scope>runtime</scope>
              </dependency>
      
              <!-- @Inject -->
              <dependency>
                  <groupId>javax.inject</groupId>
                  <artifactId>javax.inject</artifactId>
                  <version>1</version>
              </dependency>
      
              <!-- Servlet -->
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>servlet-api</artifactId>
                  <version>2.5</version>
                  <scope>provided</scope>
              </dependency>
              <dependency>
                  <groupId>javax.servlet.jsp</groupId>
                  <artifactId>jsp-api</artifactId>
                  <version>2.1</version>
                  <scope>provided</scope>
              </dependency>
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>jstl</artifactId>
                  <version>1.2</version>
              </dependency>
      
              <!-- Test -->
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.7</version>
                  <scope>test</scope>
              </dependency>        
          </dependencies>
          <build>
              <plugins>
                  <plugin>
                      <artifactId>maven-eclipse-plugin</artifactId>
                      <version>2.9</version>
                      <configuration>
                          <additionalProjectnatures>
                              <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                          </additionalProjectnatures>
                          <additionalBuildcommands>
                              <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                          </additionalBuildcommands>
                          <downloadSources>true</downloadSources>
                          <downloadJavadocs>true</downloadJavadocs>
                      </configuration>
                  </plugin>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>2.5.1</version>
                      <configuration>
                          <source>1.6</source>
                          <target>1.6</target>
                          <compilerArgument>-Xlint:all</compilerArgument>
                          <showWarnings>true</showWarnings>
                          <showDeprecation>true</showDeprecation>
                      </configuration>
                  </plugin>
                  <plugin>
                      <groupId>org.codehaus.mojo</groupId>
                      <artifactId>exec-maven-plugin</artifactId>
                      <version>1.2.1</version>
                      <configuration>
                          <mainClass>org.test.int1.Main</mainClass>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      </project>
      

      Contact.java

      public class Contact {
          private int id;
          private String name;
          private String email;
          private String address;
          private String telephone;
      
          // Default Constructor........
          public Contact()
          {
          }
          // Parameterized Constructor
          public Contact(String name, String email, String address,
                  String telephone) {
              this.name = name;
              this.email = email;
              this.address = address;
              this.telephone = telephone;
          }
          //Getters and setters I have just removed here to save the space.   
      

      ContactDao 界面

      package com.varun.contact.dao;
      import java.util.List; 
      import com.varun.contact.model.Contact;
      
      public interface ContactDao {
          public void saveOrUpdate(Contact contact);
          public void delete(int contactId);
          public Contact get(int contactId);
          public List<Contact> list();
      
      }
      

      ContactDAOImpl

      package com.varun.contact.dao;
      
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.util.List;
      
      import javax.sql.DataSource;
      
      import com.varun.contact.model.Contact;
      
      
      import org.springframework.dao.DataAccessException;
      //import com.varun.contact.dao.DataAccessException;
      import org.springframework.jdbc.core.JdbcTemplate;
      import org.springframework.jdbc.core.ResultSetExtractor;
      import org.springframework.jdbc.core.RowMapper;
      
      public class ContactDAOImpl implements ContactDao {
      
          private JdbcTemplate jdbcTemplate;
      
           public ContactDAOImpl(javax.activation.DataSource dataSource) {
                  jdbcTemplate = new JdbcTemplate((DataSource) dataSource);
              }
      
      
          //Insert or update a new contact: 
          @Override
          public void saveOrUpdate(Contact contact) {
              if(contact.getId()>0){
                  //Update
                  String sql="UPDATE CONTACT SET name=?,email=?,address=?,"
                  +"telephone=? where contact_id=?";
                  jdbcTemplate.update(sql,contact.getName(),contact.getEmail(),contact.getAddress(),
                          contact.getTelephone(),contact.getId());
              }
              else{
                  // Insert
                  String sql="INSERT INTO CONTACT(name,email,address,telephone)"
                          +"VALUES(?,?,?,?)";
                  jdbcTemplate.update(sql,contact.getName(),contact.getEmail(),contact.getAddress(),
                          contact.getTelephone());
              }
      
          }   
          //Delete a contact:
          @Override
          public void delete(int contactId) {
          String sql="DELETE FROM CONTACT where contact_id=?";
          jdbcTemplate.update(sql,contactId);         
          }
      
          //Get a particular contact:
          @Override
          public Contact get(int contactId) {
      
              String sql="SELECT * FROM CONTACT WHERE contact_id="+contactId;
               return jdbcTemplate.query(sql, new ResultSetExtractor<Contact>() {
      
                      @Override
                      public Contact extractData(ResultSet rs) throws SQLException,
                              DataAccessException {
                          if (rs.next()) {
                              Contact contact = new Contact();
                              contact.setId(rs.getInt("contact_id"));
                              contact.setName(rs.getString("name"));
                              contact.setEmail(rs.getString("email"));
                              contact.setAddress(rs.getString("address"));
                              contact.setTelephone(rs.getString("telephone"));
                              return contact;
                          }
                          return null;
                      }
      
                  });
          }
      
          //List all contact:
          @Override
          public List<Contact> list() {
              String sql = "SELECT * FROM contact";
              List<Contact> listContact = jdbcTemplate.query(sql, new RowMapper<Contact>() {
      
                  @Override
                  public Contact mapRow(ResultSet rs, int rowNum) throws SQLException {
                      Contact aContact = new Contact();
      
                      aContact.setId(rs.getInt("contact_id"));
                      aContact.setName(rs.getString("name"));
                      aContact.setEmail(rs.getString("email"));
                      aContact.setAddress(rs.getString("address"));
                      aContact.setTelephone(rs.getString("telephone"));
                      return aContact;
                  }
      
              });
              return listContact;
          }
      }
      

      MvcConfiguration

      package com.varun.contact.config;
      
      //I have removed all import to save space
      
      @Configuration
      @ComponentScan(basePackages="com.varun.contact")
      @EnableWebMvc
      
      public class MvcConfiguration extends WebMvcConfigurerAdapter {
      
          @Bean
          public ViewResolver getViewResolver(){
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
              resolver.setPrefix("/WEB-INF/views");
              resolver.setSuffix(".jsp");
              return resolver;        
          }
      
          @Override
          public void addResourceHandlers(ResourceHandlerRegistry registry) {
              registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
          }
      
           @Bean
              public DataSource getDataSource() {
                  DriverManagerDataSource dataSource = new DriverManagerDataSource();
                  dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
                  dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
                  dataSource.setUsername("system");
                  dataSource.setPassword("admin");
      
                  return (DataSource) dataSource;
              }
      
           @Bean
              public ContactDao getContactDao() {
                  return new ContactDAOImpl(getDataSource());
              }
      }
      

      的HomeController

      package com.varun.contact.controller;
      
        // I have removed all import
      @Controller
      public class HomeController {
      
          private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
      
      
          @Autowired
          private ContactDao contactDao;
      
      
          //Handler method for listing all contacts (also served as home page):
          @RequestMapping(value = "/", method = RequestMethod.GET)
          public ModelAndView listContact(ModelAndView model) throws IOException{
              java.util.List<Contact> listContact = contactDao.list();
              model.addObject("listContact", listContact);
              model.setViewName("home");
      
              return model;
      }
          //Handler method for displaying new contact form:
          @RequestMapping(value = "/newContact", method = RequestMethod.GET)
          public ModelAndView newContact(ModelAndView model) {
              Contact newContact = new Contact();
              model.addObject("contact", newContact);
              model.setViewName("ContactForm");
              return model;
          }
      
          //Handler method for inserting/updating a contact:
          @RequestMapping(value = "/saveContact", method = RequestMethod.POST)
          public ModelAndView saveContact(@ModelAttribute Contact contact) 
          {
          contactDao.saveOrUpdate(contact);
          return new ModelAndView("redirect:/");
          }
      
          //Handler method for retrieving details of a particular contact for editing:
          @RequestMapping(value = "/editContact", method = RequestMethod.GET)
          public ModelAndView editContact(HttpServletRequest request) {
              int contactId = Integer.parseInt(request.getParameter("id"));
              Contact contact = contactDao.get(contactId);
              ModelAndView model = new ModelAndView("ContactForm");
              model.addObject("contact", contact);
      
              return model;
          }
      
      }
      

3 个答案:

答案 0 :(得分:0)

尝试:

 @Repository("ContactDao")
    public class ContactDAOImpl implements ContactDao
    ....

我不认为在这种情况下需要bean声明。

答案 1 :(得分:0)

如下所示:

@Repository
public class ContactDAOImpl implements ContactDao {

或如下:

@Component
public class ContactDAOImpl implements ContactDao {

答案 2 :(得分:0)

你确定你的ContactDaoImpl是由Spring创建的吗?因为我相信如果构造函数中存在错误/异常(例如,当您创建数据源时),则无法正确创建bean。您是否尝试将try / catch放入构造函数中以检查它是否实际被调用?