У меня проблема с сохранением журналов (или любой другой информации) в базе данных при использовании Spring AOP.
Вот источник проблем:
@Aspect
@Configuration
@Component
@EnableAspectJAutoProxy
public class LoggingAspect {
@Autowired
private LogService logService;
@AfterThrowing(pointcut = "execution(* org.springframework.web.client.RestTemplate+.*(..))", throwing = "ex")
public void logError(Exception ex) {
Log log = new Log("Error!");
logService.save(log);
}
}
logService
экземпляр - это простой @Service
класс, который вызывает @Repository
методы внутри страны. Ничего особенного. Log
класс еще проще :) Он содержит только одну переменную (две, если мы включаем id):
@Entity
@Table
public class Log {
@Id
private Long id;
@Column
private String message;
//getters, setters, constructors, etc.
}
LoggingAspect
работает правильно. @AfterThrowing
совет вызывается правильно в случае каких-либо исключений. Но ничего не сохраняется в БД после вызова метода save
.
Когда я пытаюсь вызвать метод getAll()
вместо save
, все работает как положено. Все данные загружаются из базы данных.
Эта проблема относится только к методу save
.
Буду благодарен за любые подсказки.
Редактировать:
Как я упоминал ранее, классы @Service
и @Repository
на данный момент очень просты. И, возможно, стоит добавить, что вне класса аспекта все работает отлично. Возможно сохранение логов в базе данных. Эта проблема возникает только при сохранении и только при использовании во всех видах советов.
Код услуги добавлен
@Service
public class LogService {
@Autowired
private LogRepository logRepository;
@Transactional(readOnly = true)
public List<Log> getAllLogs() {
return logRepository.findAll();
}
@Transactional
public void save(Log log) {
logRepository.save(log);
}
}
Добавлен код репозитория
@Repository
public interface LogRepository extends JpaRepository<Product, Log> {
}