Как внедрить интерфейс CRUDRepository в мой класс утилиты

Я действительно не знаю, почему мой интерфейс CRUDRepository не может быть введен.

У меня есть небольшое приложение на Spring Boot, и я использую CrudRepository:

public interface ActionLogRepository extends CrudRepository<ActionLog, Integer> {
}

В моем классе обслуживания есть метод:

@Service
public class ActionRecordServiceImpl implements ActionRecordService {

 @Override
    @Transactional
    public void deleteActionRecord(Date date, String domain) {

        Set<Action> actions= myActions...(the code delibrately shortened)

        for (Action a : actions) {
                actionRepository.delete(a);
            }
        }
    }
}

Далее у меня есть перехватчик - я хочу перехватить все операции удаления и сохранить эти журналы в базе данных:

public class ActionTrackerInterceptor extends EmptyInterceptor {

    // called when record is deleted.
    public void onDelete(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        Action act = (Action) entity;
        String action = "DELETED";
        ActionLog actionLog = new ActionLog(...some data inserted...);

        MyActionLogUtil util = new MyActionLogUtil();
        util.logIt("DELETED", actionLog);
        actionLogRepository.save(actionLog);
        System.out.println("Record " + entity + " is deleted.");
    }

А мой метод util.Log выглядит так:

@Component
public class MyActionLogUtilImpl implements ActionyLogUtil {

    private ActionLogRepository actionLogRepository;

    @Autowired
    public void setActionLogRepository(ActionLogRepository actionLogRepository) {
        this.actionLogRepository = actionLogRepository;
    }

    @Override
    public void logIt(String action, ActionLog entity) {

        try {
            ActionLog actionLog = null; // = new ActionLog(...some data inserted...)
            actionLogRepository.save(actionLog);

        } finally {

        }
    }
}

Когда мое приложение запускается, устанавливается метод setActionLogRepository в MyActionLogUtilImpl и правильно вводится ActionLogRepository (не нулевое значение). Но при отладке в методе MyActionLogUtilImpl.LogIt МОЙ actionLogRepository NULL!

Мой основной класс с @SpringBootApplication находится в верхней части пакетов, поэтому проблема ComponentScan здесь не главное.

Вопрос в том, ПОЧЕМУ? Еще одна сделка? Я правда не знаю, в чем проблема. Прочитал все похожие темы в Интернете ... Помогите, пожалуйста. Спасибо.

С Уважением Мэтли

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем ActionTrackerInterceptor:

MyActionLogUtil util = new MyActionLogUtil();

Вы создаете новый экземпляр своего класса «Util» вручную, а не используете один экземпляр Spring, созданный при запуске приложения (который на самом деле имеет правильную ссылку на ваш репозиторий).

Речь идет не об управлении транзакциями, а об основных функциях DI. Обязательно прочтите Документы Spring для получения дополнительной информации о том, как DI работает в целом.

Ах, очень глупая ошибка. ОК. Решено. И я изменил INterceptor на Hibernate Listener. В этом случае, чтобы иметь возможность автоматически подключать bean-компоненты, мне пришлось применить решение, основанное на guylabs.ch/2014/02/22/…, потому что слушатели не обрабатываются контейнером Spring - нам придется вручную автоматически подключать наши bean-компоненты позже.

Matley 27.05.2018 14:07

Другие вопросы по теме