Spring3JavaConfig-注入数据源时出现问题

Spring3JavaConfig-注入数据源时出现问题,java,spring,datasource,code-injection,Java,Spring,Datasource,Code Injection,我是Spring的新手,我正试图让我的数据源注入工作起来。我得到一个“属性'dataSource'是必需的”错误。我在这件事上被难住了一段时间。提前感谢您的帮助 WebConfig.java import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org

我是Spring的新手,我正试图让我的数据源注入工作起来。我得到一个“属性'dataSource'是必需的”错误。我在这件事上被难住了一段时间。提前感谢您的帮助

WebConfig.java

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.test")
public class WebConfig extends WebMvcConfigurerAdapter {

@Autowired
DataSource Source;

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    System.out.println("addResourceHandlers :: init");
    registry.addResourceHandler("/resources/**").addResourceLocations(
            "/resources/");
}

@Bean
public InternalResourceViewResolver viewResolver() {
    System.out.println("viewResolver :: init");
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

}
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ComponentScan(basePackages = { "com.test" })
public class AppConfig {

@Bean
public DataSource dataSource() {
    System.out.println("userDBDatasource :: init");
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setUsername("foo");
    dataSource.setPassword("foo");
    return dataSource;
}

}
package com.test.foo;

import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JDBCUserDAOImpl implements JDBCUserDAO {

private Logger logger = Logger.getRootLogger();
private JdbcTemplate jdbcTemplate;
private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource) {
    logger.debug("setDataSource :: called");
    this.dataSource = dataSource;
}

public List<UserBean> getUsers() {
    logger.info("Getting List of Users!");
    List<UserBean> userBeans = new ArrayList<UserBean>();
    String sql = "SELECT * FROM users";
    jdbcTemplate = new JdbcTemplate(dataSource);
    userBeans = jdbcTemplate.query(sql, new UserBeanRowMapper());
    return userBeans;
}
}
AppConfig.java

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.test")
public class WebConfig extends WebMvcConfigurerAdapter {

@Autowired
DataSource Source;

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    System.out.println("addResourceHandlers :: init");
    registry.addResourceHandler("/resources/**").addResourceLocations(
            "/resources/");
}

@Bean
public InternalResourceViewResolver viewResolver() {
    System.out.println("viewResolver :: init");
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

}
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ComponentScan(basePackages = { "com.test" })
public class AppConfig {

@Bean
public DataSource dataSource() {
    System.out.println("userDBDatasource :: init");
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setUsername("foo");
    dataSource.setPassword("foo");
    return dataSource;
}

}
package com.test.foo;

import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JDBCUserDAOImpl implements JDBCUserDAO {

private Logger logger = Logger.getRootLogger();
private JdbcTemplate jdbcTemplate;
private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource) {
    logger.debug("setDataSource :: called");
    this.dataSource = dataSource;
}

public List<UserBean> getUsers() {
    logger.info("Getting List of Users!");
    List<UserBean> userBeans = new ArrayList<UserBean>();
    String sql = "SELECT * FROM users";
    jdbcTemplate = new JdbcTemplate(dataSource);
    userBeans = jdbcTemplate.query(sql, new UserBeanRowMapper());
    return userBeans;
}
}
JDBCUserDaoImpl.java

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.test")
public class WebConfig extends WebMvcConfigurerAdapter {

@Autowired
DataSource Source;

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    System.out.println("addResourceHandlers :: init");
    registry.addResourceHandler("/resources/**").addResourceLocations(
            "/resources/");
}

@Bean
public InternalResourceViewResolver viewResolver() {
    System.out.println("viewResolver :: init");
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

}
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ComponentScan(basePackages = { "com.test" })
public class AppConfig {

@Bean
public DataSource dataSource() {
    System.out.println("userDBDatasource :: init");
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setUsername("foo");
    dataSource.setPassword("foo");
    return dataSource;
}

}
package com.test.foo;

import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JDBCUserDAOImpl implements JDBCUserDAO {

private Logger logger = Logger.getRootLogger();
private JdbcTemplate jdbcTemplate;
private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource) {
    logger.debug("setDataSource :: called");
    this.dataSource = dataSource;
}

public List<UserBean> getUsers() {
    logger.info("Getting List of Users!");
    List<UserBean> userBeans = new ArrayList<UserBean>();
    String sql = "SELECT * FROM users";
    jdbcTemplate = new JdbcTemplate(dataSource);
    userBeans = jdbcTemplate.query(sql, new UserBeanRowMapper());
    return userBeans;
}
}
package com.test.foo;
导入java.util.ArrayList;
导入java.util.List;
导入javax.sql.DataSource;
导入org.apache.log4j.Logger;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.jdbc.core.jdbc模板;
导入org.springframework.stereotype.Repository;
@存储库
公共类JDBCUserDAOImpl实现JDBCUserDAO{
私有记录器=Logger.getRootLogger();
私有JdbcTemplate JdbcTemplate;
私有数据源;
@自动连线
public void setDataSource(数据源数据源){
debug(“setDataSource::called”);
this.dataSource=数据源;
}
公共列表getUsers(){
info(“获取用户列表!”);
List userBeans=newarraylist();
String sql=“选择*来自用户”;
jdbcTemplate=新的jdbcTemplate(数据源);
userBeans=jdbcTemplate.query(sql,新的UserBeanRowMapper());
返回userBeans;
}
}
错误

Dec 07, 2013 10:46:53 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [main] in context with path [/springmvc] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Property 'dataSource' is required] with root cause
java.lang.IllegalArgumentException: Property 'dataSource' is required
    at org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSet(JdbcAccessor.java:134)
    at org.springframework.jdbc.core.JdbcTemplate.<init>(JdbcTemplate.java:165)
    at com.tajima.models.JDBCUserDAOImpl.getUsers(JDBCUserDAOImpl.java:42)
    at com.tajima.controllers.HomeController.loadUserList(HomeController.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
2013年12月07日上午10:46:53 org.apache.catalina.core.StandardWrapperValve调用
严重:路径为[/springmvc]的上下文中Servlet[main]的Servlet.service()引发了异常[Request processing failed;嵌套异常为java.lang.IllegalArgumentException:需要属性'dataSource',这是根本原因
java.lang.IllegalArgumentException:属性“dataSource”是必需的
位于org.springframework.jdbc.support.jdbccessor.AfterPropertieSet(jdbccessor.java:134)
位于org.springframework.jdbc.core.JdbcTemplate(JdbcTemplate.java:165)
位于com.tajima.models.JDBCUserDAOImpl.getUsers(JDBCUserDAOImpl.java:42)
在com.tajima.controllers.HomeController.loadUserList(HomeController.java:53)上
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
位于org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
位于org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
位于org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
位于org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
位于org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
位于org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
位于org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
位于org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
位于org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
位于org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
运行(Thread.java:744)

从WebConfig.java中删除数据源注入

@Import注释提供了这种支持,它与SpringBeans XML文件中的元素直接等效

您没有将AppConfig类导入WebMvcConfig类文件。因此,spring无法创建名为“dataSource”的bean

在WebMvcConfig类中,需要使用@import annotation导入数据源配置类。这将有助于通过spring容器创建数据源bean

 ex:@Configuration
    @EnableWebMvc
    @Import({AppConfig.class})
    @ComponentScan(basePackages = "com.test")
    public class WebConfig extends WebMvcConfigurerAdapter {
我希望您已经正确地将webConfig类指定为DispatcherServlet的contextConfigLocation参数。如果不存在,请按照以下规定进行指定

<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
  <param-name>contextClass</param-name>
  <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>yourpackage.config.WebMvcConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>mvc</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>
   <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 <context-param>
<param-name>contextClass</param-name>
<param- value>org.springframework.web.context.support.AnnotationConfigWebApplicationC     ontext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>yourpackage.WebMvcConfig</param-value>
</context-param>

mvc
org.springframework.web.servlet.DispatcherServlet
上下文类
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
有限公司