代码之家  ›  专栏  ›  技术社区  ›  Dave Richardson

spring数据rest存储库导出的每类配置

  •  0
  • Dave Richardson  · 技术社区  · 7 年前

    我们有一个基于Spring数据REST的RESTAPI应用程序。我们有许多类型的数据公开为spring数据存储库,标记为 @RepositoryRestResource . 我们希望精确地控制在运行时公开哪些数据类型,因为我们将有几个要求略有不同的安装。

    我们如何在运行时实现对Spring Data REST公开哪些存储库的细粒度控制?

    我们天真的尝试是使用 export 中的参数 @存储资源 使用表达式,但我们看不到如何使其工作-表达式的计算结果是字符串,而不是布尔值。

    @RepositoryRestResource(exported = "${app.exportStudy}")
    public interface StudyRepository<Study> extends MongoRepository<Study,String> {
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Dave Richardson    7 年前

    解决此问题的一种方法是替换存储库检测策略。

    @Component
    @ConfigurationProperties("app.repository")
    @Data
    public class AppRepositoryConfig {
        private boolean exportStudy = true;
        private boolean exportSample = true;
        ...
    }
    

    其次,修改库存检测策略(stock RepositoryDetectionStrategy)的行为,以考虑您的配置:

    @Configuration
    @RequiredArgsConstructor
    public class AppRepositoryDetectionStrategyConfig extends RepositoryRestConfigurerAdapter {
    
        @NonNull private AppRepositoryConfig appRepositoryConfig;
    
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        RepositoryDetectionStrategy rds = config.getRepositoryDetectionStrategy();
    
        config.setRepositoryDetectionStrategy(
                repositoryDetectionStrategy(rds)
        );
    }
    
    private RepositoryDetectionStrategy repositoryDetectionStrategy(
            RepositoryDetectionStrategy repositoryDetectionStrategy) {
        RepositoryDetectionStrategy rds = metadata -> {
    
                boolean defaultExportSetting = repositoryDetectionStrategy.isExported(metadata);
    
                if  (metadata.getDomainType().equals(Study.class)) {
                    return (appRepositoryConfig.isExportStudy()) ? defaultExportSetting : false; 
                }
                ...
                return defaultExportSetting;
        };
    
        return rds;
    }