弹簧数据休息库导出的每类配置
问题描述:
我们有一个基于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;
...
}
其次,修改股票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;
}