2011-12-15 10 views
9

hibernate-enversのリビジョンリスナーで何らかのデータベース処理を行う必要があります。そのためには、Spring Frameworkの機能が必要です。これはどのように実装できますか?ここに必要性を表すコードがありますが、CustomRevisionListenerはEnversコードのコンストラクタによってインスタンス化されています。 Springには静的サービスロケータとしてSecurityContextHolderしかありません。他の豆をどのように注入するのですか? CustomRevisionListenerがEnversでコンストラクタでインスタンス化されているのでhibernate-envers Spring BeanとしてのRevisionListener 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()); 
     } 
    } 

答えて

7

、あなたは春の管理対象Beanへのハンドルを取得するための別の方法を見つける必要があります。

あなたはこれを達成するためのユーティリティクラスを作成することができます。

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

をし、あなたのCustomRevisionListener

public class CustomRevisionListener { 

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

} 
+0

おかげで、とてもうまくいきました。 – realcnbs