Weired world ... позвольте мне попробовать:
У меня есть следующие настройки mavenized:
- Springboot (1.5.5.RELEASE)
- Hibernate (5.0.9.Final; Iя знаю, что есть более новые варианты, но я придерживаюсь того, что у меня есть сейчас)
- ExtJs (6.0.0) - IntelliJ (2017.3)
Я делаю частично , сталкиваюсь сHibernate Исключение:
2018-11-20_15:04:58.007 [http-nio-8081-exec-7] [ERROR] o.a.c.c.C.[.[.[/].[dispatcherServlet]:181 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.HibernateException:
Could not obtain transaction-synchronized Session for current thread] with root cause
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate5.SpringSessionContext.currentSession(SpringSessionContext.java:133)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:697)
...
Это происходит не во всех потоках!Частично запросы от ExtJ проходят, а частично - нет.Но разве они не открыли бы транзакцию на стороне веб-сервера?
У меня есть Перехватчик;также веб-перехватчик, реализующий org.springframework.web.servlet.HandlerInterceptor
В методе preHandle
перехватчика я вызываю Службу, чтобы проверить, вошел ли пользователь в систему, и выполнить некоторую обработку управления правами.
Сбой вызываемой службы @Autowired
,Я думал, что факт доступа к сервисному методу @Autowired
позаботится об обработке сеанса / транзакции.
Ну, это был сценарий, когда мой проект создавался вручную и выполнялся с java-8 (java 8 sdk; не9, а не 10, а не 11) команда как из консоли:
mvn clean package -DskipTests && java -jar target/MyBuild.jar application-local.properties
Я только что заметил, что логин состоит из трех запросов от браузера к бэкэнду.Эти три обрабатываются бэкэндом в отдельных потоках.
При запуске проекта в IntelliJ все работает нормально .Хорошо, IntelliJ, скорее всего, не jar приложения и создает собственную команду запуска.
Но именно это выводит меня из строя из-за того, что мы обрабатываем код через конвейер развертывания / CIгде мы вручную строим проект.
И вот где он терпит неудачу: - (
Поправка:
Я изменил все, чтобы работать с JPA вместо Hibernate (ну, это все еще спящий в фоновом режиме)Точно так же, как предложил «М. Дейнм».
Теперь проблема все еще существует.
Две вещи, которые я несколько извлек. В моем Перехватчике у меня есть несколько вызовов журналирования, которые запрашивают EntityManager для hibernate-сеанса (entityManager.unwrap( Session.class )
).
Это точка, где сейчас. Так что, похоже, на preHandle(...)
моего перехватчика иногда текущий сеанс не активен. Я заявляю 'иногда', поскольку есть вызовыПерехватчик, когда он работает.
Теперь исключение выглядит следующим образом:
java.lang.IllegalStateException: No transactional EntityManager available
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:272)
at com.sun.proxy.$Proxy117.unwrap(Unknown Source)
at com.mypackage.dataaccess.DataAccessImpl.getCurrentSession(DataAccessImpl.java:89)
at com.mypackage.dataaccess.DataAccessImpl.queryByHQL(DataAccessImpl.java:382)