1

Я пытаюсь создать динамический источник данных (на основе сеанса) с использованием AbstractRoutingDataSource, но весенняя загрузка продолжает запускать функцию defineCurrentLookupKey() объекта AbstractRoutingDataSource при запуске.Spring boot 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; 

} 

}

она бросает NullPointerException, потому что RequestAttributes равна нулю. Я попытался поместить @Primary в один из источников данных, но AbstractRoutingDataSource defineCurrentLookupKey() не запускается, когда я пытаюсь выполнить запрос.

Я использую данные весны jpa.

смотри также session based data source

ответ

0

Вы не должны указать любую форму @Primary здесь.

Просто создайте и назначьте все свои источники данных AbstractRoutingDataSource. Если есть один источник данных, который должен быть по умолчанию, также установите его, используя #setDefaultTargetDataSource так же, как показывает ваш код.

NullPointerException в вашем случае - это просто то, что необходимо защитить вашему коду. Если вы обнаружите, что ваши данные запроса отсутствуют в вашем распознавателе, просто верните значение null для ключа поиска источника данных.

AbstractRoutingDataSource использует источник данных по умолчанию, определенный, если возвращаемый ключ поиска равен null, либо указанный ключ не был определен источником данных через карту поиска.

Смежные вопросы