弹簧数据休息库导出的每类配置

弹簧数据休息库导出的每类配置

问题描述:

我们有一个基于Spring Data REST的REST API应用程序。我们有许多类型的数据公开为弹簧数据存储库,标记为@RepositoryRestResource。我们想精确控制哪些数据类型在运行时公开,因为我们将有几个具有稍微不同要求的安装。弹簧数据休息库导出的每类配置

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

我们天真的尝试是在表达式中使用@RepositoryRestResource中的export参数,但我们无法看到如何使其工作 - 表达式计算为字符串,而不是布尔值。

@RepositoryRestResource(exported = "${app.exportStudy}") 
public interface StudyRepository<Study> extends MongoRepository<Study,String> { 
} 

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

首先,使用对象来存储您的配置:

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

其次,修改股票RepositoryDe​​tectionStrategy的行为要考虑到你的配置:

@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; 
}