Sping Boot -自定义启动器和jpa存储库自动连接

gab6jxml  于 7个月前  发布在  Spring
关注(0)|答案(1)|浏览(75)

我在为春 Boot 做一个定制的起动器。
我有这个类用于配置自动启动器

@Configuration
@AutoConfigureAfter(SpringDataWebAutoConfiguration.class)
@ComponentScan(basePackages = {"com.closure.table"})
public class ClosureTableAutoConfiguration {

    CategoryTypeRepository categoryTypeRepository; // is under com.closure.table.repository and is annotated

    public ClosureTableAutoConfiguration(CategoryTypeRepository categoryTypeRepository){
        this.categoryTypeRepository = categoryTypeRepository;
    }

    @Bean
    @ConditionalOnMissingBean
    public ClosureTable closureTable() {
        return new ClosureTable();
    }

    @Bean
    @ConditionalOnMissingBean
    @DependsOn("CategoryTypeRepository")
    public CategoryTypeService getCategoryTypeService() {
        return new CategoryTypeService(categoryTypeRepository);
    }
...

字符串
启动器应用程序在经典的Web应用程序中工作得很好,如果我不使用服务中的存储库,否则我会得到这个错误:

Consider defining a bean of type 'com.closure.table.repository.CategoryTypeRepository' in your configuration.


在Web应用程序中,我创建了一个像这样的配置类

@Configuration
@Import({ClosureTableAutoConfiguration.class})
public class ClosureTableConfiguration {

}


有没有一种方法来实现这个范围?

ndasle7k

ndasle7k1#

经过10个小时和阅读更多的网络上,我找到了解决方案,工程。
在启动器的自动配置中,我以这种方式更改代码:

@Configuration
@AutoConfigureBefore(JpaRepositoriesAutoConfiguration.class)
@EnableJpaRepositories
@ComponentScan  //needed
@Import(StarterEntityRegistrar.class) //needed to load entity
public class ClosureTableAutoConfiguration { // 
    ....
    
    @Bean
    @ConditionalOnMissingBean
    public CategoryTypeService getCategoryTypeService(CategoryTypeRepository categoryTypeRepository) { //moved autowired from constructor to bean definitions
        return new CategoryTypeService(categoryTypeRepository);
    }
}

字符串
...

public class StarterEntityRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AutoConfigurationPackages.register(registry, CategoryType.class.getPackageName());
    }

}


然后简单地添加自定义启动器作为依赖项。
此时,自定义启动器和测试应用程序都指向相同的数据库模式。

相关问题