Область "сеанс" не активна для текущего потока при обновлении схемы - PullRequest
0 голосов
/ 06 января 2019

Я попытался реализовать шаги динамической маршрутизации базы данных для моего приложения Все отлично работает, когда "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);
    }
}
}

1 Ответ

0 голосов
/ 06 января 2019

UserDetailsServiceImpl - это одноэлементный компонент, но HttpServletRequest - это компонент с областью запроса, в этом и заключается исключение.

попробуй использовать

ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = requestAttributes.getRequest();

вместо автоматического подключения HttpServletRequest

также попадает к источнику данных по умолчанию при маршрутизации:

@Override
protected Object determineCurrentLookupKey() {
if (RequestContextHolder.getRequestAttributes() == null) {
    return DEFAULT_ONE;
}
return db.getPreferredDb();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...