metrics-spring: StackOverflowError when using Spring 4.3

I am trying to upgrade to Spring 4.3.0, but I am unable to initialize the spring context:

[ERROR] 09:25:31  Context initialization failed []
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'healthCheckBeanPostProcessor' defined in class path resource [com/ryantenney/metrics/spring/config/annotation/DelegatingMetricsConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.beans.factory.config.BeanPostProcessor]: Factory method 'healthCheckBeanPostProcessor' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getHealthCheckRegistry' defined in class path resource [com/ryantenney/metrics/spring/config/annotation/DelegatingMetricsConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.codahale.metrics.health.HealthCheckRegistry]: Factory method 'getHealthCheckRegistry' threw exception; nested exception is java.lang.IllegalStateException: Failed to introspect annotations on public com.codahale.metrics.health.HealthCheckRegistry com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration.getHealthCheckRegistry()
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) ~[spring-beans-4.3.0.RELEASE.jar:4.3.0.RELEASE]
[... more stuff ...]
Caused by: java.lang.StackOverflowError
    at java.lang.reflect.Method.hashCode(Method.java:330) ~[?:1.8.0_65]
    at java.util.HashMap.hash(HashMap.java:338) ~[?:1.8.0_65]
    at java.util.HashMap.put(HashMap.java:611) ~[?:1.8.0_65]
    at java.util.HashSet.add(HashSet.java:219) ~[?:1.8.0_65]
    at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1119) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1183) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1208) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1086) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.core.annotation.AnnotatedElementUtils.searchWithFindSemantics(AnnotatedElementUtils.java:1060) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotationAttributes(AnnotatedElementUtils.java:656) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(AnnotatedElementUtils.java:730) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:314) ~[spring-context-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e.getHealthCheckRegistry(<generated>) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerComposite.getHealthCheckRegistry(MetricsConfigurerComposite.java:68) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration.getHealthCheckRegistry(DelegatingMetricsConfiguration.java:69) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e.CGLIB$getHealthCheckRegistry$3(<generated>) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e$$FastClassBySpringCGLIB$$7853f663.invoke(<generated>) ~[metrics-spring-3.1.3.jar:?]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) ~[spring-context-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e.getHealthCheckRegistry(<generated>) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerComposite.getHealthCheckRegistry(MetricsConfigurerComposite.java:68) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration.getHealthCheckRegistry(DelegatingMetricsConfiguration.java:69) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e.CGLIB$getHealthCheckRegistry$3(<generated>) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e$$FastClassBySpringCGLIB$$7853f663.invoke(<generated>) ~[metrics-spring-3.1.3.jar:?]
    [... repeat 100 times ...]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) ~[spring-context-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e.getHealthCheckRegistry(<generated>) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerComposite.getHealthCheckRegistry(MetricsConfigurerComposite.java:68) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration.getHealthCheckRegistry(DelegatingMetricsConfiguration.java:69) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e.CGLIB$getHealthCheckRegistry$3(<generated>) ~[metrics-spring-3.1.3.jar:?]
    at com.ryantenney.metrics.spring.config.annotation.DelegatingMetricsConfiguration$$EnhancerBySpringCGLIB$$2cc24d5e$$FastClassBySpringCGLIB$$7853f663.invoke(<generated>) ~[metrics-spring-3.1.3.jar:?]

About this issue

  • Original URL
  • State: open
  • Created 8 years ago
  • Reactions: 2
  • Comments: 15 (2 by maintainers)

Commits related to this issue

Most upvoted comments

I’m having the same issue and it looks like it is because the @EnableMetrics annotation does not work correctly on a @Configuration POJO.

This works:

@Configuration
@EnableMetrics
public class MetricsConfig extends MetricsConfigurerAdapter {
}

This does not and causes the stack overflow

@Configuration
@EnableMetrics
public class MetricsConfig {
}

This repo illustrates it: https://github.com/Trii/SpringBootMetricsSpringBug Clone and run gradle bootRun to see the stackoverflow. Open src/main/java/trii/SampleConfig.java and uncomment the import and extends to see it working.

Maybe this is intended behavior and more of a usage error.

For now I “fixed” this by removing @EnableMetrics and adding this:

@Configuration
public class CustomDelegatingMetricsConfiguration extends DelegatingMetricsConfiguration {

    @Override
    @Autowired(required = false)
    public void setMetricsConfigurers(final List<MetricsConfigurer> configurers) {
    }
}

Yes, this is happening for me as well. I upgrade to boot 1.4.x and the MetricRegistry bean can no longer create. It looks like recursion in the DelegatingMetricsConfiguration#getMetricRegistry.

Metric registry is null, and the delegates recurse.

screenshot 2016-07-16 12 09 06