2016-04-21 2 views
1

Mon application utilise versa pour écrire des données dans les tables _aud et également pour les placer dans un xml qui est écrit dans une autre table. Je le fais dans Envers 4.3 avec un audit conditionnel. Ma classe étend EnversIntegratorMigration d'Hibernate Envers 4.3 vers 5.0 - audit d'envers conditionnel

@Override 
public void integrate(Configuration configuration,SessionFactoryImplementor sessionFactory,SessionFactoryServiceRegistry serviceRegistry) 
{ 
    EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class); 
    listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE); 
    final AuditConfiguration enversConfiguration = AuditConfiguration.getFor(configuration, serviceRegistry.getService(ClassLoaderService.class)); 
    if (enversConfiguration.getEntCfg().hasAuditedEntities()) 
    {   
     listenerRegistry.appendListeners(EventType.POST_UPDATE, new PostUpdateListenerLog(enversConfiguration)); 
     listenerRegistry.appendListeners(EventType.POST_INSERT, new PostInsertListenerLog(enversConfiguration)); 
     listenerRegistry.appendListeners(EventType.POST_DELETE, new PostDeleteListenerLog(enversConfiguration)); 
    } 
} 

Dans AuditConfiguration 5.0 Envers a été retiré (https://github.com/hibernate/hibernate-orm/blob/5.0/migration-guide.adoc) de préférence pour les nouvelles org.hibernate.envers.boot.internal.EnversService

si je change mon code, la mise en œuvre du nouveau intégrateur Interface

@Override 
public void integrate(Metadata mtdt, SessionFactoryImplementor sfi, SessionFactoryServiceRegistry serviceRegistry) { 

    EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class); 
    listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE); 

    EnversService enversService = new EnversServiceImpl(); 
    if(enversService.getEntitiesConfigurations().hasAuditedEntities()) { 
     listenerRegistry.appendListeners(EventType.POST_UPDATE, new PostUpdateListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_INSERT, new PostInsertListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_DELETE, new PostDeleteListenerLog(enversService)); 
    } 

} 

ce code ne fonctionne pas parce que le EnversService n'est pas initialisé, me donnant un

java.lang.IllegalStateException: Le service n'a pas encore été initialisé à org.hibernate.envers.boot.internal.EnversServiceImpl.getEntitiesConfigurations (EnversServiceImpl.java:253)

j'ai essayé de récupérer le EnversService comme Je l'ai fait avec l'ancienne AuditConfiguration sans aucun résultat. J'ai lu le guide officiel (http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html) et je n'ai rien trouvé qui puisse m'aider.

Que puis-je faire pour récupérer une instance EnversService utilisable pour mes écouteurs personnalisés?

Merci, Andrew

Répondre

1

I décompiler classe org.hibernate.envers.boot.internal.EnversIntegrator et trouver la solution.

@Override 
public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { 

    EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class); 
    listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE); 

    EnversService enversService = serviceRegistry.getService(EnversService.class); 
    if (!enversService.isInitialized()) { 
     throw new HibernateException("Expecting EnversService to have been initialized prior to call to EnversIntegrator#integrate"); 
    } 
    if(enversService.getEntitiesConfigurations().hasAuditedEntities()) { 
     listenerRegistry.appendListeners(EventType.POST_UPDATE, new PostUpdateListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_INSERT, new PostInsertListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_DELETE, new PostDeleteListenerLog(enversService)); 
    } 
} 

Problème résolu!