私は春のデータRESTフレームワーク(春・ブート・スターター・親2.1.0.RELEASEから継承された依存関係)を使用して、春のブートAPIを持っています。私は、次のエラーメッセージを投げ、エンティティを更新するために、PUTまたはPATCHリクエストを実行しようとし、どちらも動作するようですよ。
[リクエストの処理に失敗しました。ネストされた例外はorg.springframework.transaction.TransactionSystemExceptionです:JPAトランザクションをコミットできませんでした。ネストされた例外はjavax.persistence.RollbackExceptionがあります。エラーの根本原因によってjava.lang.StackOverflowErrorとの取引]をコミット中:ヌル
私は更新しようとしているエンティティは、以下の構造を有します:
@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要求を作っています:
ボディペイロードとして持ちます
{「名」:「新しい名前」}
それは、スタックオーバーフローエラーだったので、私の最初に考えたのは、何かの再帰が起きていました。私は(@OneToMany注釈と一緒に)設定<EntityB>フィールドをコメントアウトし、私はまだエラーが発生しました。誰もが前にこのエラーを経験していますか?
問題は、私は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);
}
予想通り、すべてが動作します。