【问题标题】:spring boot autowired repository in Hibernate interceptor not working休眠拦截器中的spring boot autowired存储库不起作用
【发布时间】:2026-02-10 10:25:02
【问题描述】:

我正在使用 Hibernate 拦截器来处理更新,并且需要 Repository 来保存在数据库中。

我自动装配存储库,但它不工作。始终为空。这是我的代码:

@Component
public class AuditInterceptor extends EmptyInterceptor {

@Autowired
private LogsRepository repository;

public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
        String[] propertyNames, Type[] types) {
    if(entity instanceof Personnel) {
        for (int i = 0; i < propertyNames.length; i++) {
            if(currentState[i] != previousState[i]) {
                Log log = new Log();
                log.setEntity("Personnel");
                log.setIdEntity(id.toString());
                log.setPropertyChanged(propertyNames[i] );
                log.setOldValue(previousState[i]  != null ? previousState[i].toString() : "");
                log.setNewValue(currentState[i] != null ? currentState[i].toString() : "");
                log.setTimestamp(new Date());
                System.out.println(log.toString());
                repository.save(log);
                return true;
            }
            System.out.println("Property names :"+propertyNames[i]);
            System.out.println("Old value :"+previousState[i]);
            System.out.println("New value :"+currentState[i]);
        }
    }

    return false;
}

}

拦截器工作正常,但 LogRepository 始终为空。

【问题讨论】:

    标签: mysql hibernate spring-boot spring-data-jpa


    【解决方案1】:

    我通过实现 ApplicationContextAware 解决了这个问题

    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    @Component
    public class SpringContext implements ApplicationContextAware {
    
        private static ApplicationContext context;
    
        public static <T extends Object> T getBean(Class<T> beanClass) {
            return context.getBean(beanClass);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext context) throws BeansException {
            SpringContext.context = context;
        }
    }
    

    用法

    LogsRepository repository = SpringContext.getBean(LogsRepository.class);
    

    【讨论】: