java - 在 spring 中创建带有名称的 bean 时出错

标签 java spring

(Spring新手,对于任何明显的错误提前致歉) 尝试使用 Spring 创建一个身份验证页面。出现以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'JDBCLoginDAOImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.project.shoppingcart.dao.jdbc.JDBCLoginDAOImpl.dataSource; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.sql.DataSource] 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)}
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
    javax.servlet.GenericServlet.init(GenericServlet.java:160)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:84)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    java.lang.Thread.run(Thread.java:680)

=====

这是我的 app-context.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"
    xmlns:context="http://www.springframework.org/schema/context"
    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">

    <description>Example configuration to get you started.</description>

    <context:annotation-config /> 
    <context:component-scan base-package="org.project.shoppingcart" />
    <context:component-scan base-package="org.project.shoppingcart." />

    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver_class}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" lazy-init="true">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

=======

这是我的 JDBCLoginDAOImpl.java:

@Repository
public class JDBCLoginDAOImpl implements LoginDao {

    @Autowired
    private DataSource dataSource;

    private SimpleJdbcTemplate jdbcTemplate;

    @PostConstruct
    public void setup() {
        jdbcTemplate = new SimpleJdbcTemplate(dataSource);
    }

    public boolean validateUser(String Username, String Password) {
        int count = 0;
        String query = "select count(*) from products where username = "+Username+
                "and password = "+Password;
        count = jdbcTemplate.queryForInt(query);
        if (count > 0) {
            return true;
        }
        else {
            return false;
        }
    }
}

最佳答案

你的设置对我来说几乎是正确的,我能找到的唯一麻烦的一点是:

<context:component-scan base-package="org.project.shoppingcart" />
<context:component-scan base-package="org.project.shoppingcart." />

这是一个双组件扫描,我很确定上面两个语句是相等的(至少它们都匹配 Shoppingcart 的子包,可能它们也都匹配 Shoppingcart)。无论如何,您多次创建了多个 bean。我会首先清理它(丢失其中一个),也许您的问题就会消失。

关于java - 在 spring 中创建带有名称的 bean 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073612/

相关文章:

java - 如何在 Thymeleaf 3 中向片段添加其他内容

java - Spring Boot 设置 MongoDB 存储库

java - 无法在 Spring 中连接到 MySQL

java - libgdx ScrollPane - 不滚动?

java - 在 Java 中比较数组

spring - 将 Quartz Job 声明为 spring bean 是否有任何正当理由?

java - 如何为第三方应用程序创建连接池/仅一次?

spring - 开放 API 代码生成器 Maven 插件使用旧的 Swagger 2 注释而不是 Swagger 3 注释

java - 读取 txt 文件时从一维数组生成二维数组

java - 我正在尝试比较 For 循环内的两个数组