我们可以在 spring 引导中基于 rest api 的路径参数实现 @Conditional Bean 吗?
Can we implement @Conditional Bean based on rest api's path param in spring boot?
我有一个案例,我应该制作 spring 启动网络服务,它将从任何来源获取数据,我的其余部分 api 是 (/fetchData/{src}) 其中src 是路径变量,它是源(数据库)的名称,例如 casandra、mongodb 或任何其他 nosql .. 所以基于此我想初始化 bean 以与该数据库建立连接。那么在这种情况下我们可以使用@Conditional bean吗?但问题是,@Conditional bean 检查条件基于 属性 文件值 & 这里我们必须应用基于 rest api 的路径参数的条件。那么我应该使用 @Conditional 还是任何其他设计模式,如工厂模式?
您不能使用 @Conditional
,因为它是在启动时计算的,而路径参数值仅在运行时才知道。
您可以采取多种解决方案。您可以使用简单的工厂或链。
我用过几次的另一个例子:
创建接口
public interface MyDataSource {
SomeOutputData query(Data someDataIn);
boolean supports(String pathParam);
}
创建所有实现(Cassandra、MongoDB 等)并将这些实现的列表注入您的服务
@Autowired
private List<MyDataSource> dataSources;
然后你可以选择合适的数据源,像这样:
dataSources.stream()
.filter(dataSource -> dataSource.doesSupport(pathParam)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No datasource"))
.query(dataIn);
我有一个案例,我应该制作 spring 启动网络服务,它将从任何来源获取数据,我的其余部分 api 是 (/fetchData/{src}) 其中src 是路径变量,它是源(数据库)的名称,例如 casandra、mongodb 或任何其他 nosql .. 所以基于此我想初始化 bean 以与该数据库建立连接。那么在这种情况下我们可以使用@Conditional bean吗?但问题是,@Conditional bean 检查条件基于 属性 文件值 & 这里我们必须应用基于 rest api 的路径参数的条件。那么我应该使用 @Conditional 还是任何其他设计模式,如工厂模式?
您不能使用 @Conditional
,因为它是在启动时计算的,而路径参数值仅在运行时才知道。
您可以采取多种解决方案。您可以使用简单的工厂或链。
我用过几次的另一个例子:
创建接口
public interface MyDataSource {
SomeOutputData query(Data someDataIn);
boolean supports(String pathParam);
}
创建所有实现(Cassandra、MongoDB 等)并将这些实现的列表注入您的服务
@Autowired
private List<MyDataSource> dataSources;
然后你可以选择合适的数据源,像这样:
dataSources.stream()
.filter(dataSource -> dataSource.doesSupport(pathParam)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No datasource"))
.query(dataIn);