我们以一种凌乱的方式设置了一个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 })