Я создал глобальный 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]
Исключение не выдается в созданном мной коде перехвата. Я не понимаю, что является причиной этой проблемы.