我正在使用一个外部库,其中有
@Inject
private Optional<DataSource> dataSource;
我非常想留空。
在我的服务中,我有 2 个数据源(读写和只读)。当我运行程序时,出现错误:
Message: Multiple possible bean candidates found: [javax.sql.DataSource, javax.sql.DataSource]
因为它不知道要使用哪个DataSource。我怎样才能告诉它两者都不使用?
这是我的数据源 Beans
@Factory
public class DataSourceFactory {
@Singleton
@Named("read-only")
public DataSource dataSource(ReadOnlyDataSourceConfig config) {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl(config.getUrl());
hikariConfig.setUsername(config.getUsername());
hikariConfig.setPassword(config.getPassword());
hikariConfig.setDriverClassName(config.getDriverClassName());
return new HikariDataSource(hikariConfig);
}
@Singleton
@Named("read-and-write")
public DataSource dataSource(ReadAndWriteDataSourceConfig config) {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl(config.getUrl());
hikariConfig.setUsername(config.getUsername());
hikariConfig.setPassword(config.getPassword());
hikariConfig.setDriverClassName(config.getDriverClassName());
return new HikariDataSource(hikariConfig);
}
}
是否可以配置我的 DataSource Bean 以防止注入外部库、特定类或包?
我尝试使用@Named,但这似乎没有什么区别
那个
@Inject
private Optional<DataSource> dataSource;
很可能位于用
@Singleton
或 @Context
注释的类中。现在我们将其命名为ClassWithInject
。如果我们可以从上下文中删除此类,问题就应该得到解决。
一种方法可能是实现一个空类来替换
ClassWithInject
。
@Singleton
@Replaces(ClassWithInject.class)
public class ReplacementForClassWithInject {
}
正确的方法是使用 ApplicationContextBuilder,如 yawkat 在 this issues 中提到的那样,但由于只需要删除一个 bean,因此很容易使用上述方法。
如果
ClassWithInject
无法从上下文中删除,您必须使用正确的数据源自行配置并将其放入上下文中。
@Factory
public class ClassWithInjectFactory {
@Singleton
@Replaces(ClassWithInject.class)
public ClassWithInject buildClassWithInject(@Named("read-only") HikariDataSource dataSource) {
// configure and return ClassWithInject instance
}
}