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

Per-class configuration of spring data rest repository export

我们有一个基于 Spring Data REST 的 REST API 应用程序。我们有许多类型的数据公开为 spring 个标有 @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;
}