Java BeanDefinitionStoreException при загрузке Spring 2 - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь переписать приложение, используя Spring Boot 2 (в частности, 2.1.5.RELEASE). Предыдущая версия использовала 1.5.7.RELEASE. Мы переключаем платформы баз данных, поэтому переписываем. Класс запуска в новом и старом классах практически идентичен, оба пытаются создать компонент из другой библиотеки. Это работает в 1.5.7, но в 2.1.5, это терпит неудачу со следующим сообщением:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process 
import candidates for configuration class [com.company.consumer.ConsumerRecoveryConfiguration];
 nested exception is java.lang.IllegalStateException: Failed to introspect
annotated methods on class com.company.consumer.RecordRecovery

Вот как выглядит класс запуска в старом и новом:

Старый:

@SpringBootApplication
@ComponentScan(basePackages = {
    "com.company.core",
    "com.company.something",
    "com.company.platform",
    "com.company.config"},
    excludeFilters = @ComponentScan.Filter(type =
        FilterType.REGEX, pattern = "com.company.common.diag.*"))
@Import({SomeClass.class, ConsumerRecoveryConfiguration.class,
    ConsumerRetryConfiguration.class})
@PropertySource("classpath:build.properties")
public class SomeApplication {

  public static void main(String[] args) {
    SpringApplication.run(SomeApplication.class, args);
  }

  @Bean(name = "someDbTimingLogger")
  public TimingLogger getSomeDbTimingLogger() {
    return new TimingLogger(LoggerFactory.getLogger("timing.someDb"));
  }

  @Bean(name = "timingLogger")
  public TimingLogger getTimingLogger() {
    return new TimingLogger(LoggerFactory.getLogger("timing.consumer"));
  }

  @Bean(name = "kafkaTimingLogger")
  public TimingLogger getKafkaTimingLogger() {
    return new TimingLogger(LoggerFactory.getLogger("timing.kafka"));
  }

  @Bean(name = "parser")
  public Parser<GenericMessageModel> getSomeModelParser() {
   return new Parser<>(GenericMessageModel.class);
  }
}

Новое:

@SpringBootApplication
@ComponentScan(basePackages = {
    "com.company.core",
    "com.company.something",
    "com.company.platform",
    "com.company.config"},
    excludeFilters = @ComponentScan.Filter(
            type = FilterType.REGEX,
            pattern = "com.company.common.diag.*"
    ))
@Import({ ConsumerRecoveryConfiguration.class,
        ConsumerRetryConfiguration.class })
@PropertySource("classpath:build.properties")
public class SomeApplication {

    public static void main(String[] args) {
        SpringApplication.run(SomeApplication.class, args);
    }

    @Bean(name = "timingLogger")
    public TimingLogger getTimingLogger() { return new TimingLogger(LoggerFactory.getLogger("timing.consumer")); }

    @Bean(name = "kafkaTimingLogger")
    public TimingLogger getKafkaTimingLogger() { return new TimingLogger(LoggerFactory.getLogger("timing.kafka")); }

    @Bean(name = "parser")
    public Parser<GenericMessageModel> getSomeModelParser() { return new Parser<>(GenericMessageModel.class, null); }
}

Класс Kotlin, упомянутый во вложенном исключении, выглядит следующим образом (за исключением его многочисленных частных методов):

@Component
class RecordRecovery(val producer: KafkaProducer<String, String>, val kafkaProducerSettings: KafkaProducerSettings,
                     val recoverySettings: RecoverySettings, val objectMapper: ObjectMapper) {

    val random = ThreadLocalRandom.current()!!


    companion object {
        val LOGGER = LoggerFactory.getLogger(RecordRecovery::class.java)
    }

    fun recoverRecords(records: ConsumerRecords<String, String>, exception: Exception) {
        recoverRecords(records.map { it.value() ?: StringUtils.EMPTY }, exception)
    }

    fun recoverRecords(records: List<Any>, exception: Exception) {
        error(metaDataFor(records.count()), LOGGER, "Recovering {} records", records.count())
        val filteredRecords = records.map {  createRecoveryRecord(it) }
                .filter{ it != null }
                .map { recordToJson(it) }
                .filter { removeNulls(it) }
                .mapIndexed { index, it -> toEmergencyDataWrapper(it!!, exception, index) }
                .mapNotNull {toJSONStringOrNull(it)}
                .map {toProducerRecord(it)}
                .map { republish(it) }
                .toList()
        info(metaDataFor(filteredRecords.count()), LOGGER, "After filtering, recovering {} records", filteredRecords.count())
        filteredRecords.map { await(it) }
    }
}

А вот класс ConsumerRecoveryConfiguration (также Kotlin), о котором идет речь:

@Configuration
@Import(KafkaProducerConfig::class, RecoverySettings::class, RecordRecovery::class)
class ConsumerRecoveryConfiguration

У класса нет тела вообще. Я предполагаю, что импорт других классов приводит к тому, что Spring в основном использует их в качестве тела.

Я все еще немного зелен, когда дело доходит до Spring, поэтому я изо всех сил пытаюсь понять, почему он перестал работать, когда я перешел на SB 2. Есть предложения о том, куда мне следует обратиться или что может помочь мне это выяснить?

EDIT:

Вот полная трассировка стека в соответствии с запросом:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.company.consumer.ConsumerRecoveryConfiguration]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class com.company.consumer.RecordRecovery
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:596)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:302)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:586)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:302)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
    at com.company.SomeApplication.main(SomeApplication.java:35)
Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class com.company.consumer.RecordRecovery
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:169)
    at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:392)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:317)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:586)
    ... 20 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/json/JSONObject
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:158)
    ... 24 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.json.JSONObject
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 28 common frames omitted
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...