Я действительно не знаю, почему мой интерфейс 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 здесь не главное.
Вопрос в том, ПОЧЕМУ? Еще одна сделка? Я правда не знаю, в чем проблема. Прочитал все похожие темы в Интернете ... Помогите, пожалуйста. Спасибо.
С Уважением Мэтли





В вашем ActionTrackerInterceptor:
MyActionLogUtil util = new MyActionLogUtil();
Вы создаете новый экземпляр своего класса «Util» вручную, а не используете один экземпляр Spring, созданный при запуске приложения (который на самом деле имеет правильную ссылку на ваш репозиторий).
Речь идет не об управлении транзакциями, а об основных функциях DI. Обязательно прочтите Документы Spring для получения дополнительной информации о том, как DI работает в целом.
Ах, очень глупая ошибка. ОК. Решено. И я изменил INterceptor на Hibernate Listener. В этом случае, чтобы иметь возможность автоматически подключать bean-компоненты, мне пришлось применить решение, основанное на guylabs.ch/2014/02/22/…, потому что слушатели не обрабатываются контейнером Spring - нам придется вручную автоматически подключать наши bean-компоненты позже.