簡體   English   中英

Spring Boot:由於“奇怪”的設置,配置掃描缺少類

[英]Spring Boot: Configuration Scan missing classes due to "weird" setup

我們以一種凌亂的方式設置了一個 ETL 項目,只是為了完成工作:

該項目依賴於其他幾個 spring 項目,因此我們將這些項目作為依賴項包含在內。 這些項目包含自己的 @Configuration 類,可能會導致沖突。 我現在處於一種狀態,我在我的 ETL 項目中設置了一個動態存儲庫,但它沒有被自動裝配,拋出一個錯誤:

com.myetl.service.impl.ErrorServiceImpl 中的構造函數需要一個無法找到的類型為“com.myetl.repository.ProjectErrorRepository”的 bean。

當我啟動應用程序時,我早些時候在控制台中看到它將其視為 Redis 存儲庫:

RepositoryConfigurationExtensionSupport:Spring Data Redis - 無法安全地識別存儲庫候選接口 com.myetl.repository.ProjectErrorRepository 的存儲分配。 如果您希望此存儲庫成為 Redis 存儲庫,請考慮使用以下注釋之一來注釋您的實體:org.springframework.data.redis.core.RedisHash(首選),或考慮使用您的存儲庫擴展以下類型之一:org.springframework.data.redis.core.RedisHash(首選)。 springframework.data.keyvalue.repository.KeyValueRepository。

我的基礎項目中的任何地方都沒有 Redis 配置,但它絕對存在於我的依賴項之一中。

我嘗試了一些不同的東西,但沒有任何效果。 例如,使用排除過濾器:

@SpringBootApplication(exclude = {DifferentProjectConfiguration.class})
@ComponentScan(includeFilters =
               @ComponentScan.Filter(type= FilterType.REGEX,
                                     pattern = "com\\.etl\\..*"),
               excludeFilters =
               @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,
                                     value = {OtherProjectRedisConfiguration.class}))
public class ProjectsMigrationApplication {
...

如果我注釋掉存儲庫,應用程序將正常加載,包括控制器和服務 bean。 這個問題似乎只針對我想成為 MySql JPA 存儲庫的存儲庫。 這是我的 Repository 的定義(我嘗試使用和不使用 @Repository 注釋):

package com.etl.repository;

import com.etl.domain.ProjectError;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

public interface ProjectErrorRepository extends PagingAndSortingRepository<ProjectError, Long> {

}

@Entity
@Table(name="project_error")
@Data
public class ProjectError {
    @Id
    @Column(name = "project_error_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column
    private String errMsg;

    @Column(name = "user_email")
    private String userEmail;
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "migrationEntityManagerFactory", basePackageClasses = {
        ProjectError.class}, repositoryBaseClass = ProjectErrorRepository.class)
public class ProjectMigrationJpaConfig {

    @Bean(name = "migrationEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean migrationEntityManagerFactory(EntityManagerFactoryBuilder builder,
            DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages(ProjectError.class)
                .build();
    }

}

在迷宮式項目中診斷此類錯誤以了解 Spring 在幕后做什么的最佳方法是什么?

聽起來您正在將 Redis 作為另一個項目的傳遞依賴項引入。 您可能會遇到的是自動配置。

嘗試從您的項目中排除 Redis 自動配置,看看會發生什么。

    @SpringBootApplication(exclude = { RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM