首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模拟更新列表时StackOverflowError

使用模拟更新列表时StackOverflowError
EN

Stack Overflow用户
提问于 2018-01-12 15:13:56
回答 1查看 432关注 0票数 0

当尝试在下面测试我的updateFoos方法(使用mongo上的spring更新字段List<Foo> foos )时,它使用一个带有Foo模拟列表的StackOverflowError失败。它适用于Foo的实际实例。

春季材料的版本:

  • 春季-数据-mongodb: 1.9.1
  • 春季-数据-共用: 1.12.1
  • spring/beans/context/core/expression: 4.5.2

以下是更新方法:

代码语言:javascript
复制
public void updateFoos(String id, List<Foo> foos) {
  mongoOps.updateFirst(query(where(FIELD_ID).is(id)),
                       new Update().set(FIELD_FOOS, foos),
                       clazz);
}

下面是一个测试:

代码语言:javascript
复制
@Test
public void givenPersistedBar_whenUpdateFoos_thenUpdatesThem() {
  List<Foos> foos = Collections.nCopies(10, mock(Foo.class));

  barDao.updateFoos(ID, foos);
}

这是堆叠痕迹

代码语言:javascript
复制
java.lang.StackOverflowError
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.FilePermission.init(FilePermission.java:203)
    at java.io.FilePermission.<init>(FilePermission.java:277)
    at sun.net.www.protocol.file.FileURLConnection.getPermission(FileURLConnection.java:225)
    at sun.net.www.protocol.jar.JarFileFactory.getPermission(JarFileFactory.java:156)
    at sun.net.www.protocol.jar.JarFileFactory.getCachedJarFile(JarFileFactory.java:126)
    at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:81)
    at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122)
    at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:152)
    at java.net.URL.openStream(URL.java:1045)
    at java.lang.ClassLoader.getSystemResourceAsStream(ClassLoader.java:1331)
    at java.lang.Class.getResourceAsStream(Class.java:2221)
    at org.springframework.core.LocalVariableTableParameterNameDiscoverer.inspectClass(LocalVariableTableParameterNameDiscoverer.java:101)
    at org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:87)
    at org.springframework.core.PrioritizedParameterNameDiscoverer.getParameterNames(PrioritizedParameterNameDiscoverer.java:65)
    at org.springframework.data.mapping.model.PreferredConstructorDiscoverer.buildPreferredConstructor(PreferredConstructorDiscoverer.java:109)
    at org.springframework.data.mapping.model.PreferredConstructorDiscoverer.<init>(PreferredConstructorDiscoverer.java:74)
    at org.springframework.data.mapping.model.BasicPersistentEntity.<init>(BasicPersistentEntity.java:93)
    at org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity.<init>(BasicMongoPersistentEntity.java:75)
    at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:91)
    at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:39)
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:299)
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:489)
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:446)
    at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:689)
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:314)
...
EN

回答 1

Stack Overflow用户

发布于 2018-01-15 07:22:19

Spring分析要存储在数据库中的实体。为此,它使用反射查看要存储的类的属性。

模拟最有可能具有形成循环的属性。最有可能的是,类似于对模拟应该如何运行的信息的引用,也有对模拟的引用。因此,你得到了一个无限循环。

如果您想知道所涉及的确切属性是什么,只需在堆栈跟踪中提到的行处放置一个断点,然后进行调试即可。

要解决这个问题,不要使用模拟。我不太清楚为什么要使用模拟来测试存储库。如果您不想测试存储库,但是有些代码使用存储库来模拟存储库。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48229052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档