2011-12-15 13 views
9

Ho bisogno di fare un po 'di elaborazione del database nel listener di revisione degli hernernovest. Per questo ho bisogno di funzionalità inejction di Spring Framework. Come può essere implementato? Ecco il codice che rappresenta la necessità, ma CustomRevisionListener è istanziato da un costruttore nel codice Envers. Spring ha solo SecurityContextHolder come localizzatore di servizio statico. Come iniettare altri fagioli?hibernate-envers RevisionListener integrazione della molla come bean spring

@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()); 
     } 
    } 

risposta

7

Dal CustomRevisionListener viene istanziato da un costruttore in Envers, dovete trovare un altro modo per recuperare un handle per un bean Spring gestito.

Si potrebbe creare una classe di utilità per raggiungere questo obiettivo:

/** 
* 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; 
    } 
} 

e nella vostra CustomRevisionListener

public class CustomRevisionListener { 

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

} 
+0

Grazie, funzionava. – realcnbs