私は、AbstractRoutingDataSourceを使用してダイナミックデータソース(セッションベース)を作成しようとしていますが、起動時にAbstractRoutingDataSourceのdecideCurrentLookupKey()関数を呼び出すことを続けています。スプリングブートAbstractRoutingDataSource
@ConfigurationProperties(prefix = "datasource.int")
@Bean
public DataSource internal() {
return DataSourceBuilder.create().build();
}
@ConfigurationProperties(prefix = "datasource.ext")
@Bean
public DataSource external() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSource")
@Qualifier("dataSource")
public DynamicRoutingDataSourceResolver dataSource() {
DynamicRoutingDataSourceResolver resolver = new DynamicRoutingDataSourceResolver();
DataSource internal = internal();
DataSource external = external();
Map<Object, Object> dataSources = new HashMap<>();
dataSources.put(env.getRequiredProperty("app.param.int"), internal);
dataSources.put(env.getRequiredProperty("app.param.ext"), external);
resolver.setDefaultTargetDataSource(internal);
resolver.setTargetDataSources(dataSources);
resolver.afterPropertiesSet();
return resolver;
}
public class DynamicRoutingDataSourceResolver extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Object o = request.getSession().getAttribute(Constant.DATASOURCE);
return o;
}
}
RequestAttributesがヌルであるため、それは、NullPointerExceptionがスロー。 @Primaryをデータソースの1つに入れようとしましたが、AbstractRoutingDataSource decideCurrentLookupKey()がクエリを実行しようとしたときにトリガされていません。
私はスプリングデータjpaを使用しています。
はあなたがここに@Primary
のいずれかの形式を指定する必要はありませんもsession based data source