2017-09-26 100 views
0

我們有一個基於Spring Data REST的REST API應用程序。我們有許多類型的數據公開爲彈簧數據存儲庫,標記爲@RepositoryRestResource。我們想精確控制哪些數據類型在運行時公開,因爲我們將有幾個具有稍微不同要求的安裝。彈簧數據休息庫導出的每類配置

我們如何在運行時實現細粒度的控制,以便通過Spring Data REST公開哪些存儲庫?

我們天真的嘗試是在表達式中使用@RepositoryRestResource中的export參數,但我們無法看到如何使其工作 - 表達式計算爲字符串,而不是布爾值。

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

回答

0

解決此問題的一種方法是替換存儲庫檢測策略。

首先,使用對象來存儲您的配置:

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