Я следовал руководству по динамической маршрутизации источников данных в Spring. . Для этого мне нужно расширить AbstractRoutingDataSource, чтобы сообщить Spring, какой источник данных получить, поэтому я делаю:
public class CustomRouter extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return CustomerContextHolder.getCustomerType();
}
}
Все идет нормально, пока я не нахожу класс, отвечающий за сохранение значения customerType (оно должно быть одинаковым в течение всего сеанса):
public class CustomerContextHolder {
private static final ThreadLocal<Integer> contextHolder = new ThreadLocal<Integer>();
public static void setCustomerType(Integer customerType) {
contextHolder.set(customerType);
}
public static Integer getCustomerType() {
return (Integer) contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
}
Это создает связанную с потоком переменную customerType, но у меня есть веб-приложение с Spring и JSF, я не думаю, что с потоками, а с сеансами. Поэтому я установил его на странице входа с потоком A (View), но затем поток B (Hibernate) запрашивает значение, чтобы узнать, какой источник данных использовать, это действительно null
, потому что у него новое значение для этого потока.
Есть ли способ сделать это с ограничением сеанса, а не с ограничением потока?
Вещи, которые я пробовал до сих пор:
- Вставьте CustomRouter в представление, чтобы установить его в сеансе: не работает, вызывает цикл в зависимостях.
- Замените
ThreadLocal
целым числом: не работает, значение всегда устанавливается последним пользователем, вошедшим в систему.