当前位置: 首页 > 知识库问答 >
问题:

将对象保存到MongoDB会导致StackOverflower错误

潘鸿文
2023-03-14

错误:

2021-10-13 12:25:27.092ERROR 21016---[nio-8080-exec-3]o. a. c. c. C.[.[.[ /].[调度Servlet]: Servlet.service()用于servlet[调度Servlet]在路径[]抛出异常[处理程序调度失败;嵌套异常java.lang.StackOverflow Error],具有根本原因

堆栈跟踪(多次重复):

java.lang.StackOverflowError: null
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.createCollection(MappingMongoConverter.java:731) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:646) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeProperties(MappingMongoConverter.java:620) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:596) ~[spring-data-mongodb-3.1.5.jar:3.1.5]

此外,我怀疑这是否重要,但堆栈跟踪似乎彼此无关,因为没有一个方法相互调用。我没有花很多时间浏览第三方库,但这对我来说似乎很奇怪。

无论如何,我似乎正在尝试标准保存,但我得到的异常没有信息。这是导致保存()崩溃的POJO:

public class GameEntity {
     @Id
     @Indexed(unique = true)
     private long id;
     private List<Player> players;
     private List<Card> cards;
     private List<Card> riverCards;
     private boolean isBet;
     private boolean isDealDone;
     private BetManagerEntity betManagerEntity;

     private int desiredNumberOfPlayers;
     private int openSlots;
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date createdAt;
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date updatedAt;

//getters and setters
}

这是嵌套对象:

public class BetManagerEntity {
     private int bigBlind;
     private int smallBlind;
     private int turnNumber;
     private int turnsLeftInRound;
     private List<Player> activeBetters;
     private int pot = 0;
     private int betAmount;
     private int bigBlindTurn = -1;
     private List<Bet> bets;
     private List<String> betMessages;
     private Integer maxBet;

//getters and setters

我唯一能想到的是,也许BetManagerEntity也需要自己的@Id,所以我尝试添加它并得到一个稍微不同的错误:

OpenJDK 64位服务器VM警告:ReservedStackAccess注释方法java中存在潜在危险的堆栈溢出。util。同时发生的锁。ReentrantReadWriteLock$Sync。tryAcquireShared(I)I[1]
OpenJDK 64位服务器VM警告:ReservedStackAccess注释方法java中存在潜在危险的堆栈溢出。util。同时发生的锁。ReentrantReadWriteLock$Sync。tryReleaseShared(I)Z[1]
2021-10-13 12:42:54.845错误29272---[nio-8080-exec-2]o.a.c.c.[/]。[dispatcherServlet]:Servlet。路径为[]的上下文中servlet[dispatcherServlet]的service()引发了异常[Handler dispatch failed;嵌套异常为java.lang.StackOverflowerError],其根本原因是

java.lang.StackOverflowError: null
    at java.base/java.util.concurrent.locks.ReentrantReadWriteLock$Sync.tryReleaseShared(ReentrantReadWriteLock.java:427) ~[na:na]
    at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared(AbstractQueuedSynchronizer.java:1382) ~[na:na]
    at java.base/java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.unlock(ReentrantReadWriteLock.java:897) ~[na:na]
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:239) ~[spring-data-commons-2.4.5.jar:2.4.5]
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:201) ~[spring-data-commons-2.4.5.jar:2.4.5]
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:87) ~[spring-data-commons-2.4.5.jar:2.4.5]
    at org.springframework.data.mapping.context.MappingContext.getRequiredPersistentEntity(MappingContext.java:73) ~[spring-data-commons-2.4.5.jar:2.4.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:568) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeCollectionInternal(MappingMongoConverter.java:821) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.createCollection(MappingMongoConverter.java:736) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:646) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeProperties(MappingMongoConverter.java:620) ~[spring-data-mongodb-3.1.5.jar:3.1.5]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:596) ~[spring-data-mongodb-3.1.5.jar:3.1.5]

然后,我删除了BetManagerEntity的@Id,使其恢复到原来的状态,但当我试图保存GameEntity时,仍然得到了新的堆栈跟踪

我的存储库很简单:

package com.brewster.poker.repository;

import com.brewster.poker.model.GameEntity;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface GameRepository extends MongoRepository<GameEntity, Long> {
}

我剩下的代码中有很多内容。我制作了一个功能强大的Texas Hold Em游戏,然后进行了重构,使我的应用程序能够同时运行多个游戏,我还将数据库切换到MongoDB。

我认为我的服务类不会有多大帮助,但下面是导致错误的方法:

public NewGameResponse startNewDeal(GameEntity gameEntity, UserDto userDto){
     LOGGER.info("starting new deal with {}", userDto);
     List<Card> cards = getNewStandardDeck();

     dealPlayerCards(gameEntity.getPlayers(), cards);
     gameEntity.applyNewDeal(cards);

     betService.startNewDeal(gameEntity);
     LOGGER.info("hustling {}", gameEntity);

     GameEntity savedGame = gameRepository.save(gameEntity); //throws error

     return getNewGameResponse(savedGame, userDto);
}

这是在我试图保存之前显示gameEntity的日志

2021 10月13日12:52:21.718信息26968---[nio-8080-exec-2]c.b.poker。服务TexasHoldEmService:husting GameEntity{id=0,players=[com.brewster.poker.player。ComputerPlayer@9474326,com。布鲁斯特。扑克游戏者ComputerPlayer@12509617,com。布鲁斯特。扑克游戏者ComputerPlayer@469127f7,com。布鲁斯特。扑克游戏者HumanPlayer@6e84c90f],卡片=[钻石之王,梅花之六,红心之四,红心之女王,红心之五,钻石之女王,钻石之九,红心之三,红心之七,红心之十,黑桃之四,黑桃之十,梅花之十,红心之九,梅花之五,黑桃杰克,黑桃之二,红心之六,钻石之六,梅花之八,红心之二,黑桃之七,黑桃之五,钻石之十,Cl之三瑞银,钻石之二,黑桃王牌,梅花之九,梅花之王,钻石之五,黑桃皇后,红桃王牌,钻石之七,钻石之四,梅花之四,梅花之七,黑桃之三,钻石之八,黑桃之九,红桃之八,梅花之王,钻石之三,钻石之杰克,钻石王牌],riverCards=[],isBet=true,isDealDone=false,BetManagerEntity{bigBlind=5,smallBlind=0,turnNumber=0,turnsLeftInRound=4,activeBetters=[com.brewster.poker.player。ComputerPlayer@9474326,com。布鲁斯特。扑克游戏者ComputerPlayer@12509617,com。布鲁斯特。扑克游戏者ComputerPlayer@469127f7,com。布鲁斯特。扑克游戏者HumanPlayer@6e84c90f],pot=10,betAmount=5,bigbindturn=0,bets=[com.brewster.poker.bet。BlindAction@43eaeee0],betMessages=[HAL212发布5美元盲板],maxBet=2147483647},desiredNumberofPlayer=4}

共有1个答案

仲智
2023-03-14

确保实体之间没有循环依赖关系。(例如,实体玩家有一个对赌注的引用和一个对玩家的赌注)。

 类似资料:
  • 问题内容: 我正在尝试使用hibernate模式写入多个数据库。我已经将写和读/写会话封装在单个会话对象中。但是,当我去保存时,出现很多错误,这些对象已与另一个会话关联:“非法尝试将一个集合与两个打开的会话关联” 这是我的代码: 我试图逐出该物体并冲洗;但是,这会导致“行被另一个事务更新或删除”问题,即使两个会话都指向不同的数据库。 除了上述内容,我还尝试使用hibernate的复制功能。没有错误

  • 我有两个对象,分别是和。它们都正确地映射了条令注释和Adresa是一对一的关联。 我可以使用实体管理器分别加载Osoba和Adresa。只要Osoba没有填充属性Adresa,它就可以正常工作。但当我用属性Adresa保存Osoba并试图从数据库检索对象时,抛出了一个错误。 这就是我试图获取对象Osoba的方式。数据库中id为13的Osoba包含指向Adresa表的id。 抛出的错误是 这是我的O

  • 我不熟悉android camera API,代码中调用了PictureCallback,其中包含: 对这一行指出的例外情况是: 因为我是Android世界的新手,我不知道这个环境到底在哪里。getExternalStorageDirectory()指出。 例外说明: JAVA木卫一。FileNotFoundException:/storage/emulated/0 est。jpg:打开失败:EA

  • 问题内容: 我已经创建了一个JSON文件,并且需要能够通过电子邮件与其他协作者共享该文件。但是,尽管在R工作区中有许多处理JSON对象的主题,但实际上没有资源讨论如何实际将JSON对象导出到.JSON文件。 这是一个简单的例子: 最后一行,尝试读取JSON文件,导致错误:“ fromJSON(file =“ export.JSON”)中的错误:意外字符’R’” 显然,save()函数并不是可行的方

  • 我想使用TypeORM将键值对存储到MongoDB。我的后端API是用NestJs制作的(不确定这是否重要)。键的类型为,值的类型为,因为我想将任何内容存储到此对象。 这是我的TypeForm数据库配置 我的映射实体不会自动生成密钥,因为我想自己设置它 当我想将一个新映射保存到数据库时,我运行这个逻辑(无论在哪里) 我得到这个错误 无法读取未定义的属性属性属性名称 执行数据库实体的功能时。似乎我无

  • 我是MongoDB的新手,我正在用Mongoose创建一个简单的数据库,模型如下:用户、游戏和玩家。 因此,一个用户不包含或包含多个游戏。每个游戏都有一个玩家,每个玩家都指一个用户。如下所示(为了清晰起见,我简化了模式): 因此,现在在前端,我想向后端发送一份请愿书,为用户Joe(_id:11111)和Bob(_id:22222)创建一个新游戏,因此我向/api/games发送了一篇帖子,帖子的主