Я попытался реализовать шаги динамической маршрутизации базы данных для моего приложения
Все отлично работает, когда "hibernate.hbm2ddl.auto" - none.
Когда я хочу обновить схему базы данных, я изменяю «hibernate.hbm2ddl.auto» на «update», и получаю эту ошибку:
Вызвано: org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'scopedTarget.preferredDatabaseSession': Session 'session' не активна для текущего потока; рассмотрите возможность определения прокси-объекта с заданной областью действия для этого компонента, если вы собираетесь ссылаться на него из одноэлементного объекта; Вложенное исключение - java.lang.IllegalStateException: не найден привязанный к потоку запрос: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально получающего потока? Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet / DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter для предоставления текущего запроса.
Вызвано: java.lang.IllegalStateException: запрос с привязкой к потоку не найден: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально получающего потока? Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet / DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы отобразить текущий запрос.
в org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes (RequestContextHolder.java:131) ~ [spring-web-4.3.9.RELEASE.jar: 4.3.9.RELEASE]
Я пытаюсь создать свой собственный RequestContextHolder, но это не сработало. У меня есть бин области действия сеанса, я думаю, что-то пропустил.
Мой класс области сеанса:
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class PreferredDatabaseSession implements Serializable {
private DatabaseEnvironment preferredDb;
public DatabaseEnvironment getPreferredDb() {
return preferredDb;
}
public void setPreferredDb(DatabaseEnvironment preferredDb) {
this.preferredDb = preferredDb;
}
}
Я называю это как:
public class DataSourceRouter extends AbstractRoutingDataSource {
@Autowired
private PreferredDatabaseSession db;
@Override
protected Object determineCurrentLookupKey() {
return db.getPreferredDb();
}
}
Также звоните отсюда:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private PreferredDatabaseSession userDatabaseSession;
private void setPreferredDatabase() throws DataAccessException {
// String preferredDb = (String) request.getSession().getAttribute("preferredDb");
String preferredDb = request.getParameter("preferredDb");
if (preferredDb.equals(Constants.JPLATFORM)) {
userDatabaseSession.setPreferredDb(DatabaseEnvironment.JPLATFORM);
} else if (preferredDb.equals(Constants.TIGER)) {
userDatabaseSession.setPreferredDb(DatabaseEnvironment.TIGER);
}
}
}