J'ai mis à jour mon projet vers Spring-boot Version 2.1.0.RELEASE.
Maintenant, j'obtiens l'erreur suivante:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.ReactiveSession]: Factory method 'reactiveSession' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [ch/sbb/kat/fc/config/CassandraConfig.class]: Invocation of init method failed; nested exception is Java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:185)
at org.springframework.beans.factory.support.ConstructorResolver.lambda$instantiate$2(ConstructorResolver.Java:615)
at Java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.Java:614)
... 120 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [ch/sbb/kat/fc/config/CassandraConfig.class]: Invocation of init method failed; nested exception is Java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1745)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:576)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:498)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.Java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:199)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.Java:339)
at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7.session(<generated>)
at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.getRequiredSession(AbstractCassandraConfiguration.Java:66)
at org.springframework.data.cassandra.config.AbstractReactiveCassandraConfiguration.reactiveSession(AbstractReactiveCassandraConfiguration.Java:47)
at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7.CGLIB$reactiveSession$7(<generated>)
at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7$$FastClassBySpringCGLIB$$7973a63.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.Java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.Java:363)
at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7.reactiveSession(<generated>)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:154)
... 123 more
Caused by: Java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
at com.datastax.driver.core.Metrics.<init>(Metrics.Java:146)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.Java:1501)
at com.datastax.driver.core.Cluster.init(Cluster.Java:208)
at com.datastax.driver.core.Cluster.connectAsync(Cluster.Java:376)
at com.datastax.driver.core.Cluster.connect(Cluster.Java:332)
at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.connect(CassandraCqlSessionFactoryBean.Java:89)
at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.afterPropertiesSet(CassandraCqlSessionFactoryBean.Java:82)
at org.springframework.data.cassandra.config.CassandraSessionFactoryBean.afterPropertiesSet(CassandraSessionFactoryBean.Java:59)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$invokeInitMethods$5(AbstractAutowireCapableBeanFactory.Java:1795)
at Java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1794)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1741)
... 143 more
Caused by: Java.lang.ClassNotFoundException: com.codahale.metrics.JmxReporter
at Java.net.URLClassLoader.findClass(URLClassLoader.Java:381)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:335)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
... 155 more
L'utilisation de la propriété introduite dans ce problème https://github.com/spring-projects/spring-boot/issues/14778 ne semble pas avoir d'effet pour résoudre mon problème.
Comment désactiver jmx pour cassandra?
Ma configuration actuelle cassandra ressemble à ceci:
@Configuration
@EnableReactiveCassandraRepositories({"repository"})
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
@Value("${cassandra.Host}")
private String Host;
@Override
protected String getKeyspaceName() {
return "keyspace";
}
@Override
public String[] getEntityBasePackages() {
return new String[]{"model"};
}
@Override
public SchemaAction getSchemaAction() {
return SchemaAction.CREATE_IF_NOT_EXISTS;
}
@Override
public String getContactPoints() {
return Host;
}
}
La propriété spring.data.cassandra.jmx-enabled
Est utilisée lorsque Spring Boot configure automatiquement un bean Cassandra Cluster
. En étendant AbstractReactiveCassandraConfiguration
, vous désactivez ce configuration automatique en faveur du bean Cluster
créé par AbstractClusterConfiguration
qui est une super-classe de AbstractReactiveCassandraConfiguration
. Par conséquent, la propriété n'a aucun effet.
Vous pouvez résoudre votre problème de deux manières:
AbstractReactiveCassandraConfiguration
et utilisez les différentes propriétés spring.data.cassandra.*
Pour configurer les choses à la place.cluster
on AbstractClusterConfiguration
in CassandraConfig
, appelez super.cluster()
pour obtenir le CassandraClusterFactoryBean
puis appelez setJmxReportingEnabled(false)
on le bean d'usine avant de le retourner.Sinon, si vous n'utilisez pas Dropwizard ailleurs dans votre application, vous pourrez peut-être rétrograder vers une version plus ancienne compatible avec les rapports JMX de Cassandra en remplaçant la propriété dropwizard-metrics.version
Dans votre pom.xml
Ou build.gradle
.
au lieu de remplacer cluster
comme mentionné par Andy Wilkinson, vous pouvez alternativement remplacer getMetricsEnabled
pour toujours retourner false
.
@Override
protected boolean getMetricsEnabled() { return false; }
L'inclusion de l'ancienne version de la bibliothèque résout également le problème:
implementation("io.dropwizard.metrics:metrics-core:3.2.2")
J'ai essayé les réponses ici, je ne sais pas comment mais l'erreur persiste. J'ai lu ceci sur docs.datastax.com , où ils ont parlé de déplacer JMX reporting
Dans Metrics 4
Vers un module séparé, metrics-jmx
. Ce qu'ils ont clairement indiqué que cela pourrait provoquer des problèmes/erreurs.
Pour résoudre ce problème, je devais simplement appeler cette méthode .withoutJMXReporting()
comme ci-dessous.
Cluster cluster = Cluster.builder()
.withoutJMXReporting()
.build();
Vous pouvez suivre tranquillement ici