spring数据的每个类配置rest库导出

时间:2017-09-26 10:02:20

标签: java spring-data-rest

我们有一个基于Spring Data REST的REST API应用程序。我们将许多类型的数据公开为标记为@RepositoryRestResource的spring数据存储库。我们希望精确控制在运行时公开的数据类型,因为我们将有几个安装需求略有不同。

我们如何在运行时通过Spring Data REST公开存储库来实现细粒度控制?

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

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

1 个答案:

答案 0 :(得分: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;
}