代码之家  ›  专栏  ›  技术社区  ›  Kyan

试图在Spring上设置一个数据源,以便通过MySQL进行授权-安全bean未加载/自动连线问题

  •  0
  • Kyan  · 技术社区  · 6 年前

    我得到了这个错误

    SEVERE: Context initialization failed
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'securityDataSource'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
    

    SEVERE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener] org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'securityDataSource'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    

    我在下面提供了Java配置和安全配置文件。

    今天,我在学习教程之后,正在使用JDBC实现AuthenticationManagerBuilder。我修改了我的数据源bean以适应教程中的那个,现在我得到了这个问题。身份验证以前工作得很好,DB连接和hibernate交互也很好。

    现在都不知道从哪里开始找。

    @Configuration
    @EnableWebMvc
    @EnableTransactionManagement
    @ComponentScan(basePackages= {"domain.applicationform","domain.config","domain.service","domain.dao"})
    @PropertySource("classpath:persistence-mysql.properties")
    public class ConfigClass extends WebMvcConfigurerAdapter {
    
    
        //Var to hold props and converter for ints
        @Autowired
        private Environment env;
        private int getIntProperty(String propName) {
            String propVal = env.getProperty(propName);
            int val = Integer.parseInt(propVal);
            return val;
        }
    
        // logger
        private Logger logger = Logger.getLogger(getClass().getName());
    
        //ViewResolver
    
        @Bean
        public ViewResolver viewResolver() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    
            viewResolver.setPrefix("/WEB-INF/view/");
            viewResolver.setSuffix(".jsp");
    
            return viewResolver;
        }
    
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
        }
    
        @Bean
        public DataSource securityDataSource() {
            ComboPooledDataSource securityDataSource = new ComboPooledDataSource();
    
            try {
                securityDataSource.setDriverClass(env.getProperty("jdbc.driver"));
            } catch (PropertyVetoException e) {
                throw new RuntimeException(e);
            }
    
            //logging
            logger.info(">>> jdbc.url=" + env.getProperty("jdbc.url"));
            logger.info(">>> jdbc.user=" + env.getProperty("jdbc.user"));
    
            securityDataSource.setJdbcUrl(env.getProperty("jdbc.url"));
            securityDataSource.setUser(env.getProperty("jdbc.user"));
            securityDataSource.setPassword(env.getProperty("jdbc.password"));
    
            securityDataSource.setInitialPoolSize(getIntProperty("connection.pool.initialPoolSize"));
            securityDataSource.setMinPoolSize(getIntProperty("connection.pool.minPoolSize"));
            securityDataSource.setMaxPoolSize(getIntProperty("connection.pool.maxPoolSize"));
            securityDataSource.setMaxIdleTime(getIntProperty("connection.pool.maxIdleTime"));
            return securityDataSource;
        }
    
        private final Properties hibernateProperties() {
            Properties hibernateProperties = new Properties();
            //properties     hibernateProperties.setProperty()
    
            return hibernateProperties;
        }
    
            @Bean
            public LocalSessionFactoryBean sessionFactory() throws ClassNotFoundException {
                LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
                sessionFactory.setDataSource(securityDataSource());
                //sessionFactory.setAnnotatedClasses(new Class[] { EqualOps.class });
                sessionFactory.setPackagesToScan(
                          new String[] { "domain.applicationform","domain.dao","domain.service","domain.config"});
                sessionFactory.setHibernateProperties(hibernateProperties());
    
                return sessionFactory;
            }
    
            @Bean
            public PlatformTransactionManager hibernateTransactionManager() throws ClassNotFoundException {
                HibernateTransactionManager transactionManager
                  = new HibernateTransactionManager();
                transactionManager.setSessionFactory(sessionFactory().getObject());
                return transactionManager;
            }
    
    }
    

    这是我的安全配置

    package domain.config;
    
    
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private DataSource securityDataSource;
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(securityDataSource);
        }
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            http.authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/management/manager/**").hasRole("MANAGER")
            .antMatchers("/management/recruitment/**").hasRole("RECRUITER")
            .antMatchers("/management/equalops/**").hasRole("RECRUITER")
            .antMatchers("/management/systems/**").hasRole("ADMIN")
            .and()
                .formLogin()
                .loginPage("/authenticationPage")
                .loginProcessingUrl("/authenticateUser")
            .permitAll()
            .and()
            .logout().permitAll()
            .and()
            .exceptionHandling().accessDeniedPage("/access-denied");
        }
    }
    

    编辑1

    我的道歉,忘了发布属性文件。

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/new
    jdbc.user=root
    jdbc.password=root
    
    connection.pool.initialPoolSize=5
    connection.pool.minPoolSize=5
    connection.pool.maxPoolSize=20
    connection.pool.maxIdleTime=3000
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   stacker    6 年前

    弹簧靴 datasource 自动配置发生在application.properties中。您需要指定正确的属性才能被spring识别。

    尝试使用以下方法:

    spring.datasource.url=
    spring.datasource.username=
    spring.datasource.password=
    spring.datasource.driver-class-name=
    

    在这里你可以找到共同点 properties