javax.persistence.RollbackException: ошибка при фиксации транзакции] с первопричиной java.lang.StackOverflowError: null - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть Spring Boot API, использующий среду Spring Data REST (зависимости, унаследованные от spring-boot-starter-parent 2.1.0.RELEASE).Я пытаюсь выполнить запрос PUT или PATCH, чтобы обновить объект, но ни один из них не работает, выдав следующее сообщение об ошибке:

[Ошибка обработки запроса;вложенным исключением является org.springframework.transaction.TransactionSystemException: не удалось зафиксировать транзакцию JPA;вложенное исключение: javax.persistence.RollbackException: ошибка при фиксации транзакции] с основной причиной java.lang.StackOverflowError: null

Объект, который я пытаюсь обновить, имеет следующую структуру:

@Getter
@Setter
@Entity
@Table(name = "entity_a")
public class EntityA extends BaseEntity {
    @Column(name = "name", nullable = false, length = 100)
    private String name

    @OneToMany(mappedBy = "entityA")
    private Set<EntityB> entitiesB;
}

где BaseEntity имеет идентификатор и информацию аудита.

Я делаю запрос PUT / PATCH по следующему пути:

http://localhost:8080/api/v1/entitiesA/the_uuid

с полезной нагрузкой тела как

{"name": "new name"}

Поскольку это была ошибка переполнения стека, моей первой мыслью было нечтопроисходит рекурсивныйЯ закомментировал поле Set (вместе с аннотацией @OneToMany) и все еще сталкивался с ошибкой.Кто-нибудь сталкивался с этой ошибкой раньше?

1 Ответ

0 голосов
/ 07 декабря 2018

Проблема заключалась в том, как я реализовал интерфейс AuditorAware .Метод userDao, который я использовал, вызывал рекурсивный вызов.Я до сих пор не знаю, почему это происходит, но, глядя на этот форум , я изменил реализацию getCurrentAuditor () с:

@Override
public Optional<User> getCurrentAuditor() {
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    User user = userDao.findByUsername(username);
    return Optional.ofNullable(user);
}

на:

@Override
public Optional<User> getCurrentAuditor() {
    User auditor = null;
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication != null) {
        Object principal = authentication.getPrincipal();
        if (principal instanceof User) {
            auditor = (User) principal;
        }
    }
    return Optional.ofNullable(auditor);
}

и все работает как положено.

...