hibernate-envers RevisionListener - интеграция пружин в виде пружинных бобов - PullRequest
12 голосов
/ 15 декабря 2011

Мне нужно выполнить некоторую обработку базы данных в прослушивателе ревизий hibernate-envers. Для этого мне понадобятся возможности Spring Framework. Как это можно реализовать? Вот код, представляющий потребность, но экземпляр CustomRevisionListener создается конструктором в коде Envers. Spring имеет только SecurityContextHolder в качестве статического сервисного локатора. Как ввести другие бобы?

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

1 Ответ

11 голосов
/ 26 июня 2013

Поскольку экземпляр CustomRevisionListener создается конструктором в Envers, вам нужно найти другой способ получения дескриптора для управляемого bean-компонента Spring.

Вы можете создать служебный класс для достижения этой цели:

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

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...