我们有一个基于Spring Data REST的REST API应用程序。我们将许多类型的数据公开为标记为@RepositoryRestResource
的spring数据存储库。我们希望精确控制在运行时公开的数据类型,因为我们将有几个安装需求略有不同。
我们如何在运行时通过Spring Data REST公开存储库来实现细粒度控制?
我们天真的尝试是使用export
中的@RepositoryRestResource
参数和表达式,但我们无法看到如何使其工作 - 表达式求值为字符串,而不是布尔值
@RepositoryRestResource(exported = "${app.exportStudy}")
public interface StudyRepository<Study> extends MongoRepository<Study,String> {
}
答案 0 :(得分:0)
解决此问题的一种方法是替换存储库检测策略。
首先,使用对象存储配置:
@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;
}