Spring boot @Autowired, возвращающий ноль для PreUpdateEventListener - PullRequest
0 голосов
/ 22 марта 2020

У меня проблемы с автоматическим подключением класса 'audService' в классе Hibernate PreUpdateEventListener. Я могу автоматически подключить класс без проблем в HibernateListenerConfigurer, но не в DataPreUpdateEventListener.

Изменение данных об изменениях исходит от контроллера REST (я не думаю, что это важно).

Пожалуйста помогите мне понять, почему это не работает.

Заранее спасибо за ваше время

DataPreUpdateEventListener. java

package com.myproject.api.data.document;

import java.time.LocalDateTime;

import org.hibernate.HibernateException;
import org.hibernate.event.spi.PreUpdateEvent;
import org.hibernate.event.spi.PreUpdateEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.myproject.api.system.audit.AuditService;

@Component
@Transactional
public class DataPreUpdateEventListener implements PreUpdateEventListener {

   private static final long serialVersionUID = -2272818525597362117L;

   public static final DataPreUpdateEventListener INSTANCE = new DataPreUpdateEventListener();

   private static Logger LOGGER = LoggerFactory.getLogger(DataPreUpdateEventListener.class);

   @Autowired(required = true)
   private AuditService auditService; // this returns null!

   @Override
   public boolean onPreUpdate(PreUpdateEvent event) throws HibernateException {
       final Object entity = event.getEntity();

       String sessionId = "";

       String userId = "";

       LOGGER.info(entity.getClass().getName() + " POST UPDATE EVENT DETECTED.");

       LOGGER.info(sessionId);
       LOGGER.info(userId);

       int[] dirty = event.getPersister().findDirty(event.getState(), event.getOldState(), event.getEntity(),
               event.getSession());

       String[] names = event.getPersister().getPropertyNames();

       if (entity instanceof Document) {
           Document document = (Document) entity;
           document.setLastModifiedTime(LocalDateTime.now());

           auditService.processChangesFromPreUpdateEvent(document.getAuditname(), document.objectOwnerName,
                   document.getDocumentId(), "Update", document.getDocumentFieldsMap(), entity, event);

       }
       return false;
   }

HibernateListenerConfigurer. java

package com.myproject.api.data.document;

import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;

import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.internal.SessionFactoryImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class HibernateListenerConfigurer {

   // @PersistenceUnit
   @Autowired(required = false)
   private EntityManagerFactory emf;

   private static Logger LOGGER = LoggerFactory.getLogger(HibernateListenerConfigurer.class);

   @Autowired(required = false)
   DataPreUpdateEventListener dataPreUpdateEventListener;


   @Autowired(required = false)
   private DocumentService documentService; // this returns object


   @PostConstruct
   protected void init() {
       SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class);
       EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);

           registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(dataPreUpdateEventListener.INSTANCE  );

   }

}

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