我们以一种凌乱的方式设置了一个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.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作为其他项目的传递依赖项引入其中。您可能会费力的是autoconfig。

尝试从项目中排除Redis自动配置,然后看看能做什么。

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

09-10 02:38
查看更多