Spring Boot 尝试连接Quartz数据源时出现UnsatisfiedDependencyException

envsm3lx  于 2023-01-13  发布在  Spring
关注(0)|答案(1)|浏览(278)

我目前正在使用Quartz来存储计划的作业。当试图使用JobStore类型的JDBC在二级Quartz数据库中持久存储计划的作业时,我收到了一堆关于注射,bean的错误。
引发原因:网页服务器异常:无法启动嵌入式Tomcat
原因:org. springframework. beans.工厂.不满足的依赖项异常:创建名为"jwtFilter"的Bean时出错:通过字段"userRepo"表达的依赖关系未满足;嵌套的异常是org. springframework. bean.工厂。创建在pl. certificatemanager. CertificateManagerApp.存储库中定义的名为'userRepo'的Bean时出错。在JpaRepositoriesRegistrar上声明的@EnableJpaRepositories中定义的UserRepo。EnableJpaRepositoriesConfiguration:设置Bean属性"实体管理器"时,无法创建类型为[org. springframework. orm. jpa. SharedEntityManagerCreator]的内部Bean "(内部Bean)#29fa6b65";嵌套的异常是org. springframework. bean.工厂。创建名为"(内部Bean)#29fa6b65"的Bean时出错:设置构造函数参数时无法解析对Bean "entityManagerFactory"的引用;嵌套的异常是org. springframework. bean.工厂。创建在类路径资源[org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration $JdbcStoreTypeConfiguration. class]中定义的名为"quartzDataSourceScriptDatabaseInitializer"的Bean时出错:通过工厂方法示例化Bean失败;嵌套的异常是org. springframework. beans。无法示例化[组织.Spring框架.引导.自动配置.石英.石英数据源脚本数据库初始化程序]:工厂方法"quartzDataSourceScriptDatabaseInitializer"引发了异常;嵌套异常是java. lang.非法状态异常:无法检测数据库类型

    • 关于我的存储库和@EnableJpaRepositories的错误**

导致原因:组织。springframework。bean。工厂。bean创建异常:创建在pl. certificatemanager. CertificateManagerApp.存储库中定义的名为'userRepo'的Bean时出错。在JpaRepositoriesRegistrar上声明的@EnableJpaRepositories中定义的UserRepo。EnableJpaRepositoriesConfiguration:设置Bean属性"实体管理器"时,无法创建类型为[org. springframework. orm. jpa. SharedEntityManagerCreator]的内部Bean "(内部Bean)#29fa6b65";嵌套的异常是org. springframework. bean.工厂。创建名为"(内部Bean)#29fa6b65"的Bean时出错:设置构造函数参数时无法解析对Bean "entityManagerFactory"的引用;嵌套的异常是org. springframework. bean.工厂。创建在类路径资源[org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration $JdbcStoreTypeConfiguration. class]中定义的名为"quartzDataSourceScriptDatabaseInitializer"的Bean时出错:通过工厂方法示例化Bean失败;嵌套的异常是org. springframework. beans。无法示例化[组织.Spring框架.引导.自动配置.石英.石英数据源脚本数据库初始化程序]:工厂方法"quartzDataSourceScriptDatabaseInitializer"引发了异常;嵌套异常是java. lang.非法状态异常:无法检测数据库类型

    • 设置构造函数参数时无法解析对Bean "entityManagerFactory"的引用**

导致原因:组织。springframework。bean。工厂。bean创建异常:创建名为"(内部Bean)#29fa6b65"的Bean时出错:设置构造函数参数时无法解析对Bean "entityManagerFactory"的引用;嵌套的异常是org. springframework. bean.工厂。创建在类路径资源[org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration $JdbcStoreTypeConfiguration. class]中定义的名为"quartzDataSourceScriptDatabaseInitializer"的Bean时出错:通过工厂方法示例化Bean失败;嵌套的异常是org. springframework. beans。无法示例化[组织.Spring框架.引导.自动配置.石英.石英数据源脚本数据库初始化程序]:工厂方法"quartzDataSourceScriptDatabaseInitializer"引发了异常;嵌套异常是java. lang.非法状态异常:无法检测数据库类型

    • 最后一个直接与Quartz数据源有关。但是,我认为首先解决主数据源的问题是目前的优先事项。**

导致原因:组织。springframework。bean。工厂。bean创建异常:创建在类路径资源[org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration $JdbcStoreTypeConfiguration. class]中定义的名为"quartzDataSourceScriptDatabaseInitializer"的Bean时出错:通过工厂方法示例化Bean失败;嵌套的异常是org. springframework. beans。无法示例化[组织.Spring框架.引导.自动配置.石英.石英数据源脚本数据库初始化程序]:工厂方法"quartzDataSourceScriptDatabaseInitializer"引发了异常;嵌套异常是java. lang.非法状态异常:无法检测数据库类型

    • 应用程序.属性**
## Primary DataSource properties
database1.datasource.url=jdbc:mysql://localhost:3306/certificatemanagerdb
database1.datasource.username=root
database1.datasource.password=root
database1.datasource.configuration.maximum-pool-size=30
database1.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

## Quartz properties
spring.quartz.job-store-type=jdbc
spring.quartz.properties.org.quartz.threadPool.threadCount=5
spring.quartz.jdbc.initialize-schema=always
database2.datasource.url=jdbc:mysql://localhost:3306/quartz_schema
database2.datasource.username=root
database2.datasource.password=root
database2.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    • 数据源配置**
@Configuration
@EnableAutoConfiguration
public class DataSourcesConfiguration {
    @Bean
    @Primary
    @ConfigurationProperties("database1.datasource")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("database1.datasource.first.configuration")
    public HikariDataSource firstDataSource(DataSourceProperties firstDataSourceProperties) {
        return firstDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean
    @QuartzDataSource
    @ConfigurationProperties(prefix = "database2.datasource")
    public DataSource quartzDataSource() {
        return DataSourceBuilder.create().build();
    }
}
    • SecurityConfig将注入错误中提到的jwtFilter**
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private CustomPasswordEncoder customPasswordEncoder;

    @Autowired
    private JwtFilter jwtFilter;

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(customPasswordEncoder.getPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http = http.csrf().disable().cors().disable();

        http = http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and();

        http = http.exceptionHandling()
                .authenticationEntryPoint((request, response, exception) -> {
                    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, exception.getMessage());
                }).and();

        http.authorizeRequests()
                .antMatchers("/api/auth/**").permitAll()
                .anyRequest().authenticated();

        http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
    }
}
    • 用户存储库**
@Repository
public interface UserRepo extends JpaRepository<User, Long> {
    User findUserById(Long id);
    User findByUsername(String username);
    Boolean existsByUsername(String username);
}

当注解掉DataSourcesConfiguration中的方法**quartzDataSource()**时,一切正常(忽略Quartz Scheduler的持久数据),因此我怀疑配置Quartz DataSource的某些东西干扰了我的整个应用程序。

    • SecurityConfig中的注入类JwtUtil**使用@Component进行注解。
ql3eal8s

ql3eal8s1#

找到了解决方案。将spring.datasource.url=替换为spring.datasource.jdbcUrl=,一切正常。

相关问题