簡體   English   中英

javax.persistence.RollbackException:使用根目錄提交事務時出錯] java.lang.StackOverflowError:null

[英]javax.persistence.RollbackException: Error while committing the transaction] with root cause java.lang.StackOverflowError: null

我有一個使用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://本地主機:8080 / API / V1 / entitiesA / the_uuid

身體有效負載為

{“name”:“新名稱”}

由於這是一個堆棧溢出錯誤,我的第一個想法是遞歸正在發生的事情。 我注釋掉了Set <EntityB>字段(以及@OneToMany注釋),但我仍然遇到了錯誤。 之前有沒有人遇到過此錯誤?

問題與我實現AuditorAware <T>接口的方式有關。 我正在使用的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);
}

一切都按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM