2014-10-02 96 views
0

我想用Spring Boot,Maven和Tomcat构建一个宁静的Web服务。无法autowire - org.springframework.beans.factory.BeanCreationException

当我尝试部署maven的jar文件到Tomcat我收到此错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'selectConfRoomController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.jdbc.core.JdbcTemplate hello.SelectConfRoomController.jt; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] 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:293) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1186) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:706) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) 
at hello.Application.main(Application.java:14) 
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.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) 
at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.jdbc.core.JdbcTemplate hello.SelectConfRoomController.jt; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] 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$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:509) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:290) 
    ... 22 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] 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.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1118) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:967) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:862) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:481) 
    ... 24 common frames omitted 

我application.properties文件在包的src/main /资源

spring.datasource.url=jdbc:jtds:sqlserver://*** 
spring.datasource.username=*** 
spring.datasource.password=*** 
spring.datasource.driverClassName=net.sourceforge.jtds.jdbc.Driver 

的src/main/java的

Application.java

package hello; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

查询...

package hello; 

import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.jdbc.core.RowMapper; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class SelectConfRoomController extends JdbcTemplate{ 

    @Autowired 
    private JdbcTemplate jt; 

    @RequestMapping(value="/", method=RequestMethod.GET) 
    public List<Region> getRegions(){ 

     String sql = "SELECT OUID_Region, RegionName FROM Region"; 
     List <Region> rows = jt.query(sql, 
       new RowMapper<Region>(){ 
      @Override 
      public Region mapRow(ResultSet rs, int rowNum) throws SQLException { 
       return new Region(rs.getLong("OUID_Region"), rs.getString("RegionName")); 
      } 
     }); 

     System.out.println("querying regions"); 
     return rows; 
    } 

} 

的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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>***</groupId> 
    <artifactId>webservice-test</artifactId> 
    <version>1</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.1.7.RELEASE</version> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</artifactId> 
     </dependency> 
    </dependencies> 

    <properties> 
     <start-class>hello.Application</start-class> 
     <java.version>1.8</java.version> 
    </properties> 

    <build> 
     <finalName>ConfRoom</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

    <repositories> 
     <repository> 
      <id>spring-releases</id> 
      <url>http://repo.spring.io/libs-release</url> 
     </repository> 
    </repositories> 
    <pluginRepositories> 
     <pluginRepository> 
      <id>spring-releases</id> 
      <url>http://repo.spring.io/libs-release</url> 
     </pluginRepository> 
    </pluginRepositories> 
</project> 

this阅读的解决方案,我认为我不需要一个XML文件的印象。有人能找到我不知道的错误吗?我对这一切都很陌生,所以任何专业知识/指导将不胜感激。

+0

你在哪里声明,你想自动装配到参考'JdbcTemplate'豆?如果你没有声明这个bean,那么这就是为什么它不能自动装入它... – Tim 2014-10-02 16:30:41

+1

这是一个Spring Boot应用程序 - 你不需要这样做 – 2014-10-02 16:36:51

回答

4

我认为,问题是,你扩展的JdbcTemplate。如果没有找到这种类型的其他bean,Spring Boot将只创建一个JdbcTemplate。但是你的类是JdbcTemplate类型的bean,所以跳过了JdbcTemplate的自动配置。尝试删除“扩展JdbcTemplate”,它似乎不是你的班级所必需的。

+0

你是对的!我删除了“扩展JdbcTemplate”后收到了一条不同的错误消息,但是我已经完成了该工作,现在它可以工作。非常感谢 :) – memo 2014-10-02 18:19:05

0

您需要像下面那样在上下文xml中指定JDBCTemplate,或者您需要添加组件扫描程序包。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html

<bean id="jtDataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="*******"/> 
    <property name="url" value="*******"/> 
    <property name="username" value="*****"/> 
    <property name="password" value="**********"/> 
</bean> 
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="jtDataSource"/> --Incase if you are configuring data source 
</bean> 
+1

我不认为它需要在Spring的情况下启动应用程序... – 2014-10-02 16:34:12

0

尝试声明豆与JdbcTemplate

@Bean 
public DataSource getDataSource(){ 
    /* Return the data source with proper configuration... */ 
} 


@Autowired 
public DataSource dataSource; 



@Bean 
public JdcTemplate getJdbcTemplate(){ 
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
    return dataSource; 
} 
相关问题