2011-12-15 17 views
9

Hazırda bekletme düzenleyicisinin revizyon dinleyicisinde bazı veritabanı işlemleri yapmam gerekiyor. Bunun için Spring Framework'ün inejction yeteneklerine ihtiyacım var. Bu nasıl uygulanabilir? İşte ihtiyacı temsil eden kod ancak CustomRevisionListener Envers kodunda bir kurucu tarafından başlatılır. Yay yalnızca statik servis konumlandırıcı olarak SecurityContextHolder'a sahiptir. Diğer fasülye nasıl enjekte edilir? CustomRevisionListener yanahibernate-envers RevisionListener yayı, ilkbahar çekirdeği olarak yayına bağlandı

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

cevap

7

Envers bir yapıcısı tarafından örneği, bir bahar yönetilen fasulye için bir tanıtıcı almak için başka bir yol bulmak zorunda.

Sen bunu başarmak için bir yardımcı sınıf oluşturabilir:

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

ve CustomRevisionListener

public class CustomRevisionListener { 

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

} 
+0

Teşekkür içinde, büyük çalıştı. – realcnbs