javax.persistence.RollbackException:提交事务时出错,其根本原因是java.lang.StackOverflowError:null

时间:2018-12-07 00:20:34

标签: java spring-data-rest

我有一个使用Spring Data REST框架的Spring Boot API(依赖项从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具有ID和审核信息。

我正在对以下路径进行PUT / PATCH请求:

  

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

身体有效载荷为

  

{“名称”:“新名称”}

由于这是一个堆栈溢出错误,所以我首先想到的是递归发生了。我注释掉了Set 字段(以及@OneToMany批注),但仍然遇到该错误。有人遇到过此错误吗?

1 个答案:

答案 0 :(得分:1)

问题与我实现AuditorAware 接口的方式有关。我正在使用的userDao方法引起了递归调用。我仍然不知道为什么会这样,但是看着this forum,我从以下位置更改了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);
}

一切都会按预期进行。