2011-12-15 28 views
9

Necesito hacer algo de procesamiento de la base de datos en el listener de revisión de hibernate-envers. Para eso necesito las capacidades de inejction de Spring Framework. ¿Cómo se puede implementar esto? Aquí está el código que representa la necesidad pero CustomRevisionListener es creado por un constructor en código Envers. Spring tiene solo SecurityContextHolder como localizador de servicio estático. ¿Cómo inyectar otros frijoles?hibernate-envers RevisionListener spring integration as spring bean

@Service 
public class CustomRevisionListener implements EntityTrackingRevisionListener { 

     @Resource 
     private PersistenceManagerHibernate persistenceManagerHibernate; 

     public void newRevision(Object revisionEntity) { 
       CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity; 
    revision.setUsername(getUsername()); 
     } 


     public String getUsername() { 
    final SecurityContext context = SecurityContextHolder.getContext(); 
    if (context != null) { 
     if (context.getAuthentication() != null) { 
        return context.getAuthentication().getName(); 
     } else { 
        return "anonymous"; 
     } 
    } 
    return "anonymous"; 
     } 

     @Override 
     public void entityChanged(@SuppressWarnings("rawtypes") Class entityClass, String entityName, Serializable entityId, RevisionType revisionType, Object revisionEntity) { 
       CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity; 
       revision.setEntityId(entityId.toString()); 
       revision.setEntityName(entityName); 
       revision.setRevisionType((int)revisionType.getRepresentation()); 
       Auditable auditable = null; 
       if (entityId instanceof Long) { 
          auditable = persistenceManagerHibernate.findById(entityClass, (Long)entityId); 
       } 
       revision.setGroupName(auditable.getAuditGroupName()); 
       revision.setGroupEntityId(auditable.getAuditGroupId()); 
     } 
    } 

Respuesta

7

Desde CustomRevisionListener se crea una instancia de un constructor en Envers, usted tiene que encontrar otra manera de recuperar un identificador a un bean gestionado primavera.

Se puede crear una clase de utilidad para lograr esto:

/** 
* Utility class which provides lookup services for Spring managed beans from 
* within unmanaged beans. 
*/ 
@Component 
public class ContextLookup implements ApplicationContextAware { 

    private static ApplicationContext sApplicationContext; 

    @Override 
    public void setApplicationContext(ApplicationContext aApplicationContext) 
                 throws BeansException { 
     setContext(aApplicationContext); 
    } 

    public static void setContext(ApplicationContext aApplicationContext) { 
     sApplicationContext = aApplicationContext; 
    } 

    protected static ApplicationContext getApplicationContext() { 
     return sApplicationContext; 
    } 

    public static Object getBean(String aName) { 
    if (sApplicationContext != null) { 
     return sApplicationContext.getBean(aName); 
    } 
    return null; 
    } 

    public static <T> T getBean(Class<T> aClass) { 
     if (sApplicationContext != null) { 
     return sApplicationContext.getBean(aClass); 
     } 
     return null; 
    } 
} 

y en su CustomRevisionListener

public class CustomRevisionListener { 

    public void myMethod() { 
     .. 
     // get a handle to your spring managed bean 
     Foo foo = (Foo)ContextLookup.getBean("mySpringManagedBean"); 
     .. 
    } 

} 
+0

Gracias, funcionó muy bien. – realcnbs

Cuestiones relacionadas