Проследих урок за динамично маршрутизиране на източници на данни урок през пролетта . За това трябва да разширя AbstractRoutingDataSource, за да кажа на пролетта кой източник на данни да получа, така че правя:
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 (Преглед), но след това нишка B (Hibernate) изисква стойността, за да знае какъв източник на данни да използва, наистина е null
, защото има нова стойност за тази нишка.
Има ли някакъв начин да го направите ограничено до сесия вместо ограничено до нишка?
Неща, които съм пробвал досега:
- Инжектирайте CustomRouter в изгледа, за да го зададете в сесията: Не работи, причинява цикъл в зависимостите
- Заменете
ThreadLocal
с цяло число: Не работи, стойността винаги се задава от последния влязъл потребител