NullPointerException при загрузке flowable тасок

Добрый день.

Версия платформы: 7.2.6
Версия BProc: 1.1.2

Столкнулся со следующей проблемой:
При выполнении кода

ProcessEngines.getDefaultProcessEngine().getTaskService().createTaskQuery().active().list();

Возникает ошибка:

### Error querying database.  Cause: org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: java.lang.NullPointerException
    ### The error may exist in org/flowable/task/service/db/mapping/entity/Task.xml
    ### The error may involve org.flowable.task.service.impl.persistence.entity.TaskEntityImpl.selectTaskByQueryCriteria
    ### The error occurred while executing a query
    ### SQL: select distinct RES.*               from ACT_RU_TASK RES                                                 WHERE  RES.SUSPENSION_STATE_ = 1              order by RES.ID_ asc
    ### Cause: org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: java.lang.NullPointerException

Полный стек-трейс: stack-trace.log (55.3 КБ)

  • Код реализован в сервисе, и если вызывать этот сервис из web модуля - все работает. Ошибка падает только если вызывать сервис из core модуля (у меня вызов происходит из EntityListener’а.)
  • Не имеет значения, написана реализация через ProcessEngines.getDefaultProcessEngine().getTaskService() или через com.haulmont.addon.bproc.service.BprocTaskService. Ошибка падает и в том и в другом случае.
  • Пробовал добавить аутентификацию при помощи com.haulmont.cuba.security.app.Authentication#begin - безрезультатно.

Спасибо!

Не получилось воспроизвести проблему. Сделал сущность, сервис, BeforeInsertEntityListener. Вызвал в листенере сервис, который читает список задач. Создал из редактора сущность - листенер отработал и список задач прочитал без проблем. Можешь, пожалуйста, сделать сэмпл-проект, на котором ошибка воспроизводится?

Добрый день. Прошу прощения за долгий ответ.
Вот архив с примером sample.zip (75.8 КБ) .
Постарался повторить ситуацию максимально приближенную к той, с которой столкнулся.
В примере, как и в основном проекте, загрузка процессных тасок происходит после добавления роил одному из пользователей.

Спасибо.

    @Override
    public void onAfterInsert(final UserRole entity, final Connection connection) {
        TransactionSynchronizationManager.registerSynchronization(
                new TransactionSynchronizationAdapter() {
                    @Override
                    public void afterCommit() {
                        exampleService.exampleVoid();
                    }
                }
        );
   }

В чём по ходу проблема - метод afterCommit() вызывается после коммита транзакции, а в нём у тебя вызываются сервисы чтения списка задач. Эти сервисы используют текущую транзакцию, которая у тебя уже закоммичена. Я так подозреваю, что от этого NPE и валится там дальше. Вопрос в связи с этим - а тебе синхронизация транзакций (TransactionSynchronizationManager.registerSynchronization) там нужна? Без неё, если просто вызвать сервис, чтение списка отрабатывает нормально. Или даже больше - твою логику из BeforeInsertEntityListener вызвать нельзя?

1 симпатия

Добрый день.
Спасибо за ответ. Проблема, действительно, была в том, что отсутствовала открытая транзакция.

Синхронизация транзакций была добавлена, чтобы далее по логике можно было загрузить пользователя со всеми ролями. Это нужно, т.к. логика вызывается не только из листенера.
Тем не менее, выяснив причину ошибки, можно подумать над дальнейшими решениями.

Еще раз спасибо за ответ!