Как добавить интерфейс CRUDRepository в мой класс утилит - PullRequest
0 голосов
/ 27 мая 2018

Я действительно не знаю, почему мой интерфейс 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.LogIt выглядит так:

@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 IS МОЕ actionLogRepository NULL!

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

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

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

1 Ответ

0 голосов
/ 27 мая 2018

В вашем ActionTrackerInterceptor:

MyActionLogUtil util = new MyActionLogUtil();

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

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

...