2017-06-27 3 views
1

Nous sommes confrontés à un moment difficile pour résoudre ce problème! Nous essayons d'utiliser MTA pour nos services de démarrage de printemps sans utiliser un locataire par défaut. Cela signifie que nous souhaitons renvoyer null de notre implémentation CurrentTenantIdentifierResolver lorsque aucun locataire n'est présent dans le contexte actuel. Cela fonctionne très bien dans les autres services que nous avons construits avec JavaEE + Hibernate + Deltaspike Data mais échoue avec nos services Spring au démarrage.Spring Boot Multi Location sans locataire par défaut

Le message d'exception est le suivant: « Causée par: org.hibernate.HibernateException: SessionFactory configuré pour le multi-location, mais aucun identifiant de locataire spécifié »

Le problème semble être l'usine de référentiel en essayant de créer des instances/beans of/pour nos dépôts crud au démarrage quand aucun locataire n'est (et ne sera pas) présent: à org.springframework.data.jpa.repository.support.JpaRepositoryFactory. (JpaRepositoryFactory.java:59) ~ [spring-data -jpa-1.11.3.RELEASE.jar: na]

Donc, notre question est de savoir si quelqu'un là-bas a une solution à ce problème que nous aimerions éviter d'utiliser un locataire par défaut. Pour nous, l'utilisation d'un défaut semble être sujette aux erreurs et cacherait un état d'application illégal.

Nous utilisons la version parentale 1.5.3.RELEASE. Si important: Nos services sont de simples services JSON RPC et le locataire sera présent dans les requêtes http entrantes et mis sur un thread local par un intercepteur mvc. Dans le monde JavaEE, nous utilisons des filtres web pour cela.

Merci beaucoup pour votre aide!

Répondre

0

En fait, je n'ai pas essayé l'approche.

A l'origine l'exception se produit dans the code

protected AbstractSessionImpl(SessionFactoryImpl factory, String tenantIdentifier) { 
    this.factory = factory; 
    this.tenantIdentifier = tenantIdentifier; 
    if (MultiTenancyStrategy.NONE == factory.getSettings().getMultiTenancyStrategy()) { 
     if (tenantIdentifier != null) { 
      throw new HibernateException("SessionFactory was not configured for multi-tenancy"); 
     } 
    } 
    else { 
     if (tenantIdentifier == null) { 
      throw new HibernateException("SessionFactory configured for multi-tenancy, but no tenant identifier specified"); 
     } 
    } 
} 

La suggestion est de remplacer l'usine de la session de mise en veille prolongée (voir the example) pour revenir MultiTenancyStrategy.NONE si aucun locataire présente dans le contexte actuel

+0

Hm cela ne se sent pas bien . Nous utilisons MTA mais dites Hibernate que nous ne sommes pas si aucun locataire n'est présent. Ceci introduirait à nouveau la possibilité de cacher un état illégal ... – xstring

+0

La meilleure solution jusqu'à présent est de renvoyer une chaîne vide qui conduirait à une exception quand la connexion est utilisée. – xstring