Spring, Interceptors, некоторые ExtJs и HibernateException на консоли против IntelliJ - PullRequest
0 голосов
/ 21 ноября 2018

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)

1 Ответ

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

Хорошо.Я заметил, что все веб-контроллеры Spring имеют @ Transactional (где указано использование БД.)
Это работает.

Насколько я понимаю, не имеет значения, куда поместить @ Transactional аннотация до тех пор, пока метод / объект-объект вызывается через механизм пружины @ Autowire .
Если я хочу, чтобы что-то выполнялось в транзакционном поведении, я бы пометил его наближайшая возможная область.
Вот так я бы решил, куда поместить @ Transactional

. В конце концов, он работает, но я не удовлетворен решением.Если кто-то может прояснить поведение и / или мое понимание, дайте мне знать: -)

...