1

In my spring-boot maven project, one of the dependencies is bringing spring-data-commons. That scans through the classes in my project and throws StackOverflow error. The class it doesn't like is the following,

class TreeNode<T> {
    private T someData = null;
    private List<TreeNode<T>> children = new ArrayList<>();
}

I suppose it is trying some reflection mechanism on the fields and subsequently fails due to some indefinite loop. logs during spring-boot app start.

Caused by: java.lang.StackOverflowError
    at java.util.AbstractMap.hashCode(AbstractMap.java:528) ~[?:1.8.0_121]
    at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:396) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.core.ResolvableType.calculateHashCode(ResolvableType.java:865) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.core.ResolvableType.<init>(ResolvableType.java:140) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.core.ResolvableType.forType(ResolvableType.java:1349) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.core.ResolvableType.forType(ResolvableType.java:1320) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.core.GenericTypeResolver.resolveType(GenericTypeResolver.java:260) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.data.util.TypeDiscoverer.resolveType(TypeDiscoverer.java:186) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.util.TypeDiscoverer.createInfo(TypeDiscoverer.java:128) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.util.ParentTypeAwareTypeInformation.createInfo(ParentTypeAwareTypeInformation.java:73) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.util.TypeDiscoverer.getPropertyInformation(TypeDiscoverer.java:246) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.util.TypeDiscoverer.getProperty(TypeDiscoverer.java:221) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.util.ParentTypeAwareTypeInformation.getProperty(ParentTypeAwareTypeInformation.java:28) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.mapping.model.AbstractPersistentProperty.<init>(AbstractPersistentProperty.java:66) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.mapping.model.AnnotationBasedPersistentProperty.<init>(AnnotationBasedPersistentProperty.java:68) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.neo4j.mapping.Neo4jPersistentProperty.<init>(Neo4jPersistentProperty.java:74) ~[spring-data-neo4j-4.2.3.RELEASE.jar:?]
    at org.springframework.data.neo4j.mapping.Neo4jMappingContext.createPersistentProperty(Neo4jMappingContext.java:95) ~[spring-data-neo4j-4.2.3.RELEASE.jar:?]
    at org.springframework.data.neo4j.mapping.Neo4jMappingContext.createPersistentProperty(Neo4jMappingContext.java:42) ~[spring-data-neo4j-4.2.3.RELEASE.jar:?]
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:487) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:465) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:693) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:329) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:508) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:465) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:693) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:329) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:508) ~[spring-data-commons-1.13.3.RELEASE.jar:?]
    at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:465) ~[spring-data-common]s-1.13.3.RELEASE.jar:?

I don't want it to scan this class (or any class for that matter).I was not successful just removing spring-data-commons. as it used in other parts of my application to inject some session objects.

Any suggestions to solve this problem?

P.S: I'm not an expert in spring-data. But have been using spring for quite some time.

Cheers!

brownfox
  • 557
  • 8
  • 14
  • 2
    this error is perfect for this site, hahahahaha !!! – jmhostalet Oct 10 '17 at 07:17
  • This `TreeNode` class belongs to your project right? Is it inside a package that gets scanned from `Spring`? If you move it to another package not picked-up from `Spring` wouldn't this solve the problem? – pleft Oct 10 '17 at 11:30
  • @jmhostalet haha. true! – brownfox Oct 11 '17 at 01:17
  • @pleft yes, this class belongs to my project. I tried that too, moving around from package named "dao" to "foo" just to verify. I think right now it is scanning everywhere. I don't know how to configure it (spring-data-commons) to exclude a specific directory. – brownfox Oct 11 '17 at 01:18
  • @brownfox `Spring-boot` by default scans from the package where the `@SpringBootApplication` class exists and all it's child subpackages. Place the `TreeNode` class in a sibling package to the package of the `@SpringBootApplication` class. Otherwise check for the option `scanBasePackages` of `@SpringBootApplication` annotation. – pleft Oct 11 '17 at 06:42

0 Answers0