Как сохранить логи в базе данных в совете АОП - PullRequest
0 голосов
/ 24 июня 2019

У меня проблема с сохранением журналов (или любой другой информации) в базе данных при использовании 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> {
}

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Похоже на обработку транзакций.

Но больше информации было бы неплохо, Я могу только догадываться здесь .Так мало пунктов, чтобы проверить, если вы этого еще не сделали.

Я полагаю, вы поместили @Transational в Сервис или Репозитарий, верно?Также убедитесь, что у вас есть Репозиторий, Служба в отдельных классах с механизмом проксирования по умолчанию в Spring.

Отладка и добавление ведения журнала для транзакций jpa, hibernate и spring.

0 голосов
/ 25 июня 2019

Хорошо. Я нашел решение! Как я и подозревал, это была проблема транзакции. Новая транзакция должна быть запущена независимо от любой существующей транзакции. Таким образом, одна строка (или, скорее, свойство транзакции) отсутствует в @Service классе

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(Log log) {
    logRepository.save(log);
}

Спасибо всем, кто помог решить проблему.

...