Исключение LocalContainerEntityManagerFactoryBean java .lang.IllegalStateException: Нет значения для ключа, связанного с потоком - PullRequest
0 голосов
/ 30 апреля 2020

Я создал глобальный API, который можно вызывать из внешних приложений. Приведен мой код: -

@Autowired
BindingService binding;

@PostMapping("/fetchList")
public JSONObject fetchList(@RequestBody FilterDTO filter)
{

    JSONObject result = null;
    if (Util.isNotNullOrEmpty(filter.getClientCode()))
    {
        TenantClientRelation client =
                tenantClientRelationRepository.findByClientNameOrClientCodeAndEnabledTrue(
                        filter.getClientCode(), filter.getClientCode());

        if (Util.isNotNullOrEmpty(client))
        {
            try
            {
                binding.unbindSession();
                TenantContext.setCurrentTenant(client.getTenantName());
                binding.bindSession();
                result = fetchService.fetchList(filter);
            }
            catch (Exception e)
            {
                result = new JSONObject();
                result.put("response", e.toString());
            }
        }

    }
    else
    {
        result = new JSONObject();
        result.put("response", "Client Code is mandatory");
    }

    return result;
}

Мое приложение является многопользовательским. Сначала я проверяю, есть ли база данных для предоставленного кода из базы данных ROOT. Если доступно, я сначала отменяю привязку текущего EntityManagerFactory, устанавливаю владельца и связываю новый EntityManagerFactory. Дан код: -

@Autowired
EntityManagerFactory entityManagerFactory;

public void bindSession()
{

    try
    {
        if (!TransactionSynchronizationManager.hasResource(entityManagerFactory))
        {
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            TransactionSynchronizationManager.bindResource(entityManagerFactory,
                    new EntityManagerHolder(entityManager));
        }
    }
    catch (Exception e)
    {
        logger.error(Constant.EXCEPTION, e);
    }
}

/**
 * Unbind entity session.
 * 
 * Copyright 2018, Neeyamo India All rights reserved.
 * 
 * @author ET1116 Bharat Choudhary
 * @version 1.0
 * @throws URISyntaxException
 */
public void unbindSession()
{

    try
    {
        if (Util.isNotNullOrEmpty(entityManagerFactory)
                && TransactionSynchronizationManager.hasResource(entityManagerFactory))
        {
            EntityManagerHolder emHolder =
                    (EntityManagerHolder) TransactionSynchronizationManager
                            .unbindResource(entityManagerFactory);
            EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager());
        }
    }
    catch (Exception e)
    {
        logger.error(Constant.EXCEPTION, e);
    }
}

Код работает нормально, и я получаю результат. Но в конце выдается исключение: -

 ERROR  -HandlerInterceptor.afterCompletion threw exception    
java.lang.IllegalStateException: No value for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@19fefe73] bound to thread [ajp-nio-8020-exec-136]

Исключение не выдается в созданном мной коде перехвата. Я не понимаю, что является причиной этой проблемы.

...