Spring Security-没有类型为'的合格bean;DataSource';可用:至少需要1个符合autowire候选资格的bean

Spring Security-没有类型为'的合格bean;DataSource';可用:至少需要1个符合autowire候选资格的bean,spring,spring-security,Spring,Spring Security,我试图重复Spring安全文档中的内容,并试图保护一个网页作为测试。我严格按照spring编写的文档来做每件事 但它不起作用。我已经被这个问题折磨了7天了。我快疯了。 我不知道该怎么办,也不知道如何克服这个错误。它发生在项目的装配阶段。 谁能帮忙。 以下是错误日志: MessageWebApplicationInitializer.class 包com.concretepage.security @Override protected Class<?>[] getRoo

我试图重复Spring安全文档中的内容,并试图保护一个网页作为测试。我严格按照spring编写的文档来做每件事



但它不起作用。我已经被这个问题折磨了7天了。我快疯了。 我不知道该怎么办,也不知道如何克服这个错误。它发生在项目的装配阶段。 谁能帮忙。

以下是错误日志:


MessageWebApplicationInitializer.class



包com.concretepage.security

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[]{ WebSecurityConfig.class, SQLConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[]{FreeMarkerConfig.class };
}

// ...
SecurityWebApplicationInitializer.class


WebSecurity配置类



包com.com页面

HomeController.class




xml


4.0.0
com.cn网页
混凝土页
1.0-快照
org.apache.maven.plugins
maven编译器插件
3.8.1
${java.version}
${java.version}
${encoding}
UTF-8
假的
1.8
UTF-8
org.springframework
spring框架bom表
5.2.3.1发布
聚甲醛
进口
org.springframework.security
spring安全bom表
5.2.2.1发布
聚甲醛
进口
org.springframework.security
spring安全内核
org.springframework.security
spring安全网
org.springframework.security
spring安全配置
org.springframework
SpringJDBC
org.springframework
SpringWebMVC
org.springframework
spring上下文支持
javax.servlet
javax.servlet-api
4.0.1
mysql
mysql连接器java
8.0.19
org.freemarker
自由标记
2.3.29

显然,您的
WebSecurityConfig
SQLConfig
中找不到bean。修改
消息WebApplicationInitializer
;尝试将
SQLConfig.class
放入
getRootConfigClasses()

@覆盖
受保护类[]getRootConfigClasses(){
返回新类[]{WebSecurityConfig.Class,SQLConfig.Class};
}
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{FreeMarkerConfig.Class};
}
// ...
getRootConfigClasses()
中的所有配置类都用于创建父应用程序上下文,而
getServletConfigClasses()
中的配置类是子上下文。子上下文可以
@Autowire
根上下文bean,但不能反过来

查看更多信息在此

package com.concretepage.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

@Configuration
@ComponentScan({"com.concretepage"})
public class FreeMarkerConfig {

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setTemplateLoaderPath("/WEB-INF/templates");
        configurer.setDefaultEncoding("UTF-8");
        return configurer;
    }

    @Bean
    public ViewResolver getViewResolver(){
        FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
        viewResolver.setSuffix(".ftl");
        viewResolver.setContentType("text/html;charset=UTF-8");
        viewResolver.setCache(false);
        return viewResolver;
    }
}
package com.concretepage.config;

import com.concretepage.security.WebSecurityConfig;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

@Order(1)
public class MessageWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{ WebSecurityConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{ SQLConfig.class, FreeMarkerConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}
package com.concretepage.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

@Configuration
@ComponentScan("com.concretepage.security")
public class SQLConfig {

    public SQLConfig() {
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/mysecurity?serverTimezone=UTC");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("1234");
        return driverManagerDataSource;
    }
}
package com.concretepage.security;

import org.springframework.core.annotation.Order;
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

@Order(2)
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}
package com.concretepage.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.*;
import org.springframework.security.core.userdetails.User;

import javax.sql.DataSource;


@EnableWebSecurity
public class WebSecurityConfig {

    @Autowired
    public DataSource dataSource;

    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        // ensure the passwords are encoded properly
        User.UserBuilder user = User.builder();
        auth
                .jdbcAuthentication()
                .dataSource(dataSource)
                .withDefaultSchema()
                .withUser(user.username("user").password("{noop}password").roles("USER"))
                .withUser(user.username("admin").password("{noop}password").roles("USER","ADMIN"));
    }
}
package com.concretepage;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home () {
        return "/home";
    }

    @GetMapping("/login")
    public String login () {
        return "/login";
    }

}
    <?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>com.concretepage</groupId>
    <artifactId>ConcretePage</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${encoding}</encoding>
                </configuration>
            </plugin>

        </plugins>
    </build>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <java.version>1.8</java.version>
        <encoding>UTF-8</encoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>5.2.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-bom</artifactId>
                <version>5.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>

<!--        Spring Security-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
        </dependency>



<!--        Spring Framework-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>



        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.29</version>
        </dependency>

    </dependencies>

</project>
@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[]{ WebSecurityConfig.class, SQLConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[]{FreeMarkerConfig.class };
}

// ...