From 9e5fe777c066b53df34bdb20b85c045838a24d8b Mon Sep 17 00:00:00 2001 From: qimaohong Date: Fri, 10 Oct 2025 15:04:18 +0800 Subject: [PATCH] =?UTF-8?q?api=E6=8E=A5=E5=8F=A3=E9=AA=8C=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + logs/application-test.log | 2406 ++++++++++++++++++++ pom.xml | 6 + .../common/sign/ApiSignPropertiesTest.java | 110 + .../deepchart/common/sign/SignInterceptorTest.java | 266 +++ .../com/deepchart/common/sign/SignUtilTest.java | 260 +++ .../deepchart/controller/PublicControllerTest.java | 52 + .../deepchart/controller/UserControllerTest.java | 203 ++ .../integration/ApiSignIntegrationTest.java | 222 ++ 9 files changed, 3526 insertions(+) create mode 100644 src/test/java/com/deepchart/common/sign/ApiSignPropertiesTest.java create mode 100644 src/test/java/com/deepchart/common/sign/SignInterceptorTest.java create mode 100644 src/test/java/com/deepchart/common/sign/SignUtilTest.java create mode 100644 src/test/java/com/deepchart/controller/PublicControllerTest.java create mode 100644 src/test/java/com/deepchart/controller/UserControllerTest.java create mode 100644 src/test/java/com/deepchart/integration/ApiSignIntegrationTest.java diff --git a/.gitignore b/.gitignore index 667aaef..18e9f3c 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ build/ ### VS Code ### .vscode/ +test/ diff --git a/logs/application-test.log b/logs/application-test.log index e7be2e5..f433501 100644 --- a/logs/application-test.log +++ b/logs/application-test.log @@ -4727,3 +4727,2409 @@ Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$Data at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172) ... 121 common frames omitted 2025-10-10 13:35:36.803 [main] DEBUG o.s.t.c.s.DirtiesContextTestExecutionListener - After test class: class [DeepchartApplicationTests], class annotated with @DirtiesContext [false] with mode [null] +2025-10-10 15:03:31.977 [background-preinit] DEBUG org.jboss.logging - Logging Provider: org.jboss.logging.Slf4jLoggerProvider found via system property +2025-10-10 15:03:31.983 [background-preinit] DEBUG o.h.v.i.x.config.ValidationXmlParser - Trying to load META-INF/validation.xml for XML based Validator configuration. +2025-10-10 15:03:31.984 [background-preinit] DEBUG o.h.v.i.x.c.ResourceLoaderHelper - Trying to load META-INF/validation.xml via TCCL +2025-10-10 15:03:31.984 [background-preinit] DEBUG o.h.v.i.x.c.ResourceLoaderHelper - Trying to load META-INF/validation.xml via Hibernate Validator's class loader +2025-10-10 15:03:31.984 [background-preinit] DEBUG o.h.v.i.x.config.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only. +2025-10-10 15:03:31.989 [background-preinit] DEBUG o.h.v.i.e.r.TraversableResolvers - Found jakarta.persistence.Persistence on classpath containing 'getPersistenceUtil'. Assuming JPA 2 environment. Trying to instantiate JPA aware TraversableResolver +2025-10-10 15:03:31.989 [background-preinit] DEBUG o.h.v.i.e.r.TraversableResolvers - Instantiated JPA aware TraversableResolver of type org.hibernate.validator.internal.engine.resolver.JPATraversableResolver. +2025-10-10 15:03:32.007 [background-preinit] DEBUG o.h.v.m.ResourceBundleMessageInterpolator - Loaded expression factory via original TCCL +2025-10-10 15:03:32.014 [main] INFO c.d.i.ApiSignIntegrationTest - Starting ApiSignIntegrationTest using Java 17.0.16 with PID 54216 (started by homil in D:\project\www\deepchart) +2025-10-10 15:03:32.014 [main] DEBUG c.d.i.ApiSignIntegrationTest - Running with Spring Boot v3.5.6, Spring v6.2.11 +2025-10-10 15:03:32.014 [main] INFO c.d.i.ApiSignIntegrationTest - The following 1 profile is active: "test" +2025-10-10 15:03:32.015 [main] DEBUG o.s.boot.SpringApplication - Loading source class com.deepchart.DeepchartApplication +2025-10-10 15:03:32.025 [main] DEBUG o.s.w.c.s.GenericWebApplicationContext - Refreshing org.springframework.web.context.support.GenericWebApplicationContext@9d200de +2025-10-10 15:03:32.038 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor' +2025-10-10 15:03:32.048 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory' +2025-10-10 15:03:32.081 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000252: Using org.hibernate.validator.internal.engine.DefaultPropertyNodeNameProvider as property node name provider. +2025-10-10 15:03:32.086 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator as ValidatorFactory-scoped message interpolator. +2025-10-10 15:03:32.086 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.resolver.JPATraversableResolver as ValidatorFactory-scoped traversable resolver. +2025-10-10 15:03:32.086 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.util.ExecutableParameterNameProvider as ValidatorFactory-scoped parameter name provider. +2025-10-10 15:03:32.087 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.DefaultClockProvider as ValidatorFactory-scoped clock provider. +2025-10-10 15:03:32.087 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.scripting.DefaultScriptEvaluatorFactory as ValidatorFactory-scoped script evaluator factory. +2025-10-10 15:03:32.108 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\common\exception\GlobalExceptionHandler.class] +2025-10-10 15:03:32.109 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\common\sign\ApiSignProperties.class] +2025-10-10 15:03:32.110 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\common\sign\SignInterceptor.class] +2025-10-10 15:03:32.115 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\config\JpaConfig.class] +2025-10-10 15:03:32.116 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\config\WebConfig.class] +2025-10-10 15:03:32.122 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\controller\UserController.class] +2025-10-10 15:03:32.130 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Ignored because not a concrete top-level class: file [D:\project\www\deepchart\target\classes\com\deepchart\repository\UserRepository.class] +2025-10-10 15:03:32.131 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\service\impl\UserServiceImpl.class] +2025-10-10 15:03:32.544 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-10-10 15:03:32.553 [main] DEBUG o.s.d.r.c.RepositoryConfigurationDelegate - Scanning for JPA repositories in packages com.deepchart.repository. +2025-10-10 15:03:32.556 [main] DEBUG o.s.c.i.s.PathMatchingResourcePatternResolver - Skipping search for files matching pattern [**/*.class]: directory [D:\project\www\deepchart\target\test-classes\com\deepchart\repository] does not exist +2025-10-10 15:03:32.558 [main] DEBUG o.s.d.r.c.RepositoryComponentProvider - Identified candidate component class: file [D:\project\www\deepchart\target\classes\com\deepchart\repository\UserRepository.class] +2025-10-10 15:03:32.572 [main] DEBUG o.s.c.i.s.PathMatchingResourcePatternResolver - Skipping search for files matching pattern [**/*Impl.class]: directory [D:\project\www\deepchart\target\test-classes\com\deepchart\repository] does not exist +2025-10-10 15:03:32.579 [main] INFO o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 25 ms. Found 1 JPA repository interface. +2025-10-10 15:03:32.920 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.test.context.ImportsContextCustomizer$ImportsCleanupPostProcessor' +2025-10-10 15:03:32.981 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'propertySourcesPlaceholderConfigurer' +2025-10-10 15:03:32.988 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.test.mock.mockito.MockitoPostProcessor' +2025-10-10 15:03:32.989 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'emBeanDefinitionRegistrarPostProcessor' +2025-10-10 15:03:32.989 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor' +2025-10-10 15:03:33.032 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor' +2025-10-10 15:03:33.033 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.data.jpa.domain.support.AuditingBeanFactoryPostProcessor' +2025-10-10 15:03:33.034 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'bootstrapExecutorAliasPostProcessor' +2025-10-10 15:03:33.036 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'preserveErrorControllerTargetClassPostProcessor' +2025-10-10 15:03:33.037 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory' +2025-10-10 15:03:33.037 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.transaction.config.internalTransactionalEventListenerFactory' +2025-10-10 15:03:33.043 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor' +2025-10-10 15:03:33.045 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor' +2025-10-10 15:03:33.050 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalPersistenceAnnotationProcessor' +2025-10-10 15:03:33.051 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.test.mock.mockito.MockitoPostProcessor$SpyPostProcessor' +2025-10-10 15:03:33.052 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor' +2025-10-10 15:03:33.053 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.internalConfigurationPropertiesBinder' +2025-10-10 15:03:33.057 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jdbcConnectionDetailsHikariBeanPostProcessor' +2025-10-10 15:03:33.060 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.aop.config.internalAutoProxyCreator' +2025-10-10 15:03:33.084 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'methodValidationPostProcessor' +2025-10-10 15:03:33.086 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'methodValidationPostProcessor' via factory method to bean named 'environment' +2025-10-10 15:03:33.101 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.methodValidationExcludeFilter' +2025-10-10 15:03:33.121 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'persistenceExceptionTranslationPostProcessor' +2025-10-10 15:03:33.122 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'persistenceExceptionTranslationPostProcessor' via factory method to bean named 'environment' +2025-10-10 15:03:33.126 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webServerFactoryCustomizerBeanPostProcessor' +2025-10-10 15:03:33.129 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'errorPageRegistrarBeanPostProcessor' +2025-10-10 15:03:33.130 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthEndpointGroupsBeanPostProcessor' +2025-10-10 15:03:33.131 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' +2025-10-10 15:03:33.131 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' +2025-10-10 15:03:33.154 [main] DEBUG o.s.a.a.a.ReflectiveAspectJAdvisorFactory - Found AspectJ method: public void org.springframework.beans.factory.aspectj.AbstractDependencyInjectionAspect.ajc$before$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$1$e854fa65(java.lang.Object) +2025-10-10 15:03:33.157 [main] DEBUG o.s.a.a.a.ReflectiveAspectJAdvisorFactory - Found AspectJ method: public void org.springframework.beans.factory.aspectj.AbstractDependencyInjectionAspect.ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$2$1ea6722c(java.lang.Object) +2025-10-10 15:03:33.159 [main] DEBUG o.s.a.a.a.ReflectiveAspectJAdvisorFactory - Found AspectJ method: public void org.springframework.beans.factory.aspectj.AbstractDependencyInjectionAspect.ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$3$6aa27052(java.lang.Object) +2025-10-10 15:03:33.261 [main] DEBUG o.s.a.a.AspectJExpressionPointcut - Pointcut parser rejected expression [(beanConstruction(bean) && (preConstructionCondition() && inConfigurableBean()))]: java.lang.IllegalArgumentException: error Type referred to is not an annotation type: Configurable +2025-10-10 15:03:33.262 [main] DEBUG o.s.a.a.AspectJExpressionPointcut - Pointcut parser rejected expression [(beanConstruction(bean) && (postConstructionCondition() && inConfigurableBean()))]: java.lang.IllegalArgumentException: error Type referred to is not an annotation type: Configurable +2025-10-10 15:03:33.263 [main] DEBUG o.s.a.a.AspectJExpressionPointcut - Pointcut parser rejected expression [(beanDeserialization(bean) && inConfigurableBean())]: java.lang.IllegalArgumentException: error Type referred to is not an annotation type: Configurable +2025-10-10 15:03:33.263 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'transactionAttributeSource' +2025-10-10 15:03:33.265 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'transactionInterceptor' +2025-10-10 15:03:33.265 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'transactionInterceptor' via factory method to bean named 'transactionAttributeSource' +2025-10-10 15:03:33.269 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.transaction.config.internalTransactionAdvisor' via factory method to bean named 'transactionAttributeSource' +2025-10-10 15:03:33.269 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.transaction.config.internalTransactionAdvisor' via factory method to bean named 'transactionInterceptor' +2025-10-10 15:03:33.272 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'meterRegistryPostProcessor' +2025-10-10 15:03:33.273 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'meterRegistryPostProcessor' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@9d200de' +2025-10-10 15:03:33.276 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'metricsRepositoryMethodInvocationListenerBeanPostProcessor' +2025-10-10 15:03:33.277 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'observationRegistryPostProcessor' +2025-10-10 15:03:33.278 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'projectingArgumentResolverBeanPostProcessor' +2025-10-10 15:03:33.295 [main] DEBUG o.s.u.c.s.UiApplicationContextUtils - Unable to locate ThemeSource with name 'themeSource': using default [org.springframework.ui.context.support.ResourceBundleThemeSource@f18b738] +2025-10-10 15:03:33.296 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'applicationTaskExecutor' +2025-10-10 15:03:33.297 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$TaskExecutorConfiguration' +2025-10-10 15:03:33.298 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'threadPoolTaskExecutorBuilder' +2025-10-10 15:03:33.298 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$ThreadPoolTaskExecutorBuilderConfiguration' +2025-10-10 15:03:33.305 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties' +2025-10-10 15:03:33.306 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.BoundConfigurationProperties' +2025-10-10 15:03:33.314 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'threadPoolTaskExecutorBuilder' via factory method to bean named 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties' +2025-10-10 15:03:33.318 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'applicationTaskExecutor' via factory method to bean named 'threadPoolTaskExecutorBuilder' +2025-10-10 15:03:33.335 [main] DEBUG o.s.s.c.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor' +2025-10-10 15:03:33.341 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.test.context.support.internalDynamicPropertyRegistrarBeanInitializer' +2025-10-10 15:03:33.343 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dataSourceScriptDatabaseInitializer' +2025-10-10 15:03:33.343 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.sql.init.DataSourceInitializationConfiguration' +2025-10-10 15:03:33.344 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dataSource' +2025-10-10 15:03:33.345 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari' +2025-10-10 15:03:33.346 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties' +2025-10-10 15:03:33.356 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jdbcConnectionDetails' +2025-10-10 15:03:33.356 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$PooledDataSourceConfiguration' +2025-10-10 15:03:33.357 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'jdbcConnectionDetails' via factory method to bean named 'spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties' +2025-10-10 15:03:33.361 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'dataSource' via factory method to bean named 'spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties' +2025-10-10 15:03:33.361 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'dataSource' via factory method to bean named 'jdbcConnectionDetails' +2025-10-10 15:03:33.361 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'dataSource' via factory method to bean named 'environment' +2025-10-10 15:03:33.370 [main] WARN o.s.w.c.s.GenericWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Failed to initialize dependency 'dataSourceScriptDatabaseInitializer' of LoadTimeWeaverAware bean 'entityManagerFactory': Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception with message: Failed to determine a suitable driver class +2025-10-10 15:03:33.371 [main] DEBUG o.s.s.c.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor' +2025-10-10 15:03:33.403 [main] DEBUG o.s.b.a.l.ConditionEvaluationReportLogger - + + +============================ +CONDITIONS EVALUATION REPORT +============================ + + +Positive matches: +----------------- + + AopAutoConfiguration matched: + - @ConditionalOnBooleanProperty (spring.aop.auto=true) matched (OnPropertyCondition) + + AopAutoConfiguration.AspectJAutoProxyingConfiguration matched: + - @ConditionalOnClass found required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + AopAutoConfiguration.AspectJAutoProxyingConfiguration.CglibAutoProxyConfiguration matched: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition) + + ApplicationAvailabilityAutoConfiguration#applicationAvailability matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.availability.ApplicationAvailability; SearchStrategy: all) did not find any beans (OnBeanCondition) + + CacheMeterBinderProvidersConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.binder.MeterBinder' (OnClassCondition) + + CompositeMeterRegistryAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.composite.CompositeMeterRegistry' (OnClassCondition) + + DataSourceAutoConfiguration matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition) + - @ConditionalOnMissingBean (types: ?; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DataSourceAutoConfiguration.PooledDataSourceConfiguration matched: + - AnyNestedCondition 1 matched 1 did not; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.PooledDataSourceAvailable PooledDataSource found supported DataSource; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.ExplicitType @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (DataSourceAutoConfiguration.PooledDataSourceCondition) + - @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DataSourceAutoConfiguration.PooledDataSourceConfiguration#jdbcConnectionDetails matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DataSourceConfiguration.Hikari matched: + - @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition) + - @ConditionalOnProperty (spring.datasource.type=com.zaxxer.hikari.HikariDataSource) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DataSourceHealthContributorAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource' (OnClassCondition) + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found bean 'dataSource' (OnBeanCondition) + + DataSourceHealthContributorAutoConfiguration#dbHealthContributor matched: + - @ConditionalOnMissingBean (names: dbHealthIndicator,dbHealthContributor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DataSourceInitializationConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.jdbc.datasource.init.DatabasePopulator' (OnClassCondition) + - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.sql.init.SqlDataSourceScriptDatabaseInitializer,org.springframework.boot.autoconfigure.sql.init.SqlR2dbcScriptDatabaseInitializer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DataSourcePoolMetadataProvidersConfiguration.HikariPoolDataSourceMetadataProviderConfiguration matched: + - @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition) + + DataSourcePoolMetricsAutoConfiguration matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: javax.sql.DataSource,io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans 'simpleMeterRegistry', 'dataSource' (OnBeanCondition) + + DataSourcePoolMetricsAutoConfiguration.DataSourcePoolMetadataMetricsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider; SearchStrategy: all) found bean 'hikariPoolDataSourceMetadataProvider' (OnBeanCondition) + + DataSourcePoolMetricsAutoConfiguration.HikariDataSourceMetricsConfiguration matched: + - @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition) + + DataSourceTransactionManagerAutoConfiguration matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.transaction.TransactionManager' (OnClassCondition) + + DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration matched: + - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition) + + DiskSpaceHealthContributorAutoConfiguration matched: + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + + DiskSpaceHealthContributorAutoConfiguration#diskSpaceHealthIndicator matched: + - @ConditionalOnMissingBean (names: diskSpaceHealthIndicator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DispatcherServletAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + DispatcherServletAutoConfiguration.DispatcherServletConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.ServletRegistration' (OnClassCondition) + - Default DispatcherServlet did not find dispatcher servlet beans (DispatcherServletAutoConfiguration.DefaultDispatcherServletCondition) + + DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.ServletRegistration' (OnClassCondition) + - DispatcherServlet Registration did not find servlet registration bean (DispatcherServletAutoConfiguration.DispatcherServletRegistrationCondition) + + DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration matched: + - @ConditionalOnBean (names: dispatcherServlet types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet' (OnBeanCondition) + + EndpointAutoConfiguration#endpointCachingOperationInvokerAdvisor matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + EndpointAutoConfiguration#endpointOperationParameterMapper matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoke.ParameterValueMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + EndpointAutoConfiguration#propertiesEndpointAccessResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.EndpointAccessResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ErrorMvcAutoConfiguration#basicErrorController matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.error.ErrorController; SearchStrategy: current) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration#errorAttributes matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.error.ErrorAttributes; SearchStrategy: current) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration.DefaultErrorViewResolverConfiguration#conventionErrorViewResolver matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration matched: + - @ConditionalOnBooleanProperty (server.error.whitelabel.enabled=true) matched (OnPropertyCondition) + - ErrorTemplate Missing did not find error template view (ErrorMvcAutoConfiguration.ErrorTemplateMissingCondition) + + ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#beanNameViewResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#defaultErrorView matched: + - @ConditionalOnMissingBean (names: error; SearchStrategy: all) did not find any beans (OnBeanCondition) + + GenericCacheConfiguration matched: + - Cache org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration automatic cache type (CacheCondition) + + HealthContributorAutoConfiguration#pingHealthContributor matched: + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + + HealthEndpointAutoConfiguration matched: + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + + HealthEndpointConfiguration#healthContributorRegistry matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthContributorRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthEndpoint matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthEndpoint; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthEndpointGroupMembershipValidator matched: + - @ConditionalOnBooleanProperty (management.endpoint.health.validate-group-membership=true) matched (OnPropertyCondition) + + HealthEndpointConfiguration#healthEndpointGroups matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthEndpointGroups; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthHttpCodeStatusMapper matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HttpCodeStatusMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthStatusAggregator matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.StatusAggregator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointWebExtensionConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + - @ConditionalOnBean (types: org.springframework.boot.actuate.health.HealthEndpoint; SearchStrategy: all) found bean 'healthEndpoint' (OnBeanCondition) + + HealthEndpointWebExtensionConfiguration#healthEndpointWebExtension matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthEndpointWebExtension; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointWebExtensionConfiguration.MvcAdditionalHealthEndpointPathsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet' (OnBeanCondition) + + HibernateJpaAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean', 'jakarta.persistence.EntityManager', 'org.hibernate.engine.spi.SessionImplementor' (OnClassCondition) + + HibernateJpaConfiguration matched: + - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition) + + HttpClientAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.client.ClientHttpRequestFactory' (OnClassCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition) + + HttpClientAutoConfiguration#clientHttpRequestFactoryBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpClientAutoConfiguration#clientHttpRequestFactorySettings matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.ClientHttpRequestFactorySettings; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpClientObservationsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.observation.Observation' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + HttpClientObservationsAutoConfiguration.MeterFilterConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + HttpEncodingAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.filter.CharacterEncodingFilter' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (server.servlet.encoding.enabled=true) matched (OnPropertyCondition) + + HttpEncodingAutoConfiguration#characterEncodingFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.filter.CharacterEncodingFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpMessageConvertersAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.HttpMessageConverter' (OnClassCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition) + + HttpMessageConvertersAutoConfiguration#messageConverters matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.http.HttpMessageConverters; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.StringHttpMessageConverter' (OnClassCondition) + + HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration#stringHttpMessageConverter matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.StringHttpMessageConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InfoEndpointAutoConfiguration matched: + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + + InfoEndpointAutoConfiguration#infoEndpoint matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.info.InfoEndpoint; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration#jacksonObjectMapperBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration.JacksonObjectMapperConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + JacksonAutoConfiguration.JacksonObjectMapperConfiguration#jacksonObjectMapper matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration.ParameterNamesModuleConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.module.paramnames.ParameterNamesModule' (OnClassCondition) + + JacksonAutoConfiguration.ParameterNamesModuleConfiguration#parameterNamesModule matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.module.paramnames.ParameterNamesModule; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonEndpointAutoConfiguration#endpointObjectMapper matched: + - @ConditionalOnClass found required classes 'com.fasterxml.jackson.databind.ObjectMapper', 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + - @ConditionalOnBooleanProperty (management.endpoints.jackson.isolated-object-mapper=true) matched (OnPropertyCondition) + + JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + - @ConditionalOnPreferredJsonMapper JACKSON no property was configured and Jackson is the default (OnPreferredJsonMapperCondition) + - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found bean 'jacksonObjectMapper' (OnBeanCondition) + + JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration#mappingJackson2HttpMessageConverter matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter ignored: ?; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JdbcClientAutoConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; SearchStrategy: all) found a single bean 'namedParameterJdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.simple.JdbcClient; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JdbcTemplateAutoConfiguration matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition) + - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition) + + JdbcTemplateConfiguration matched: + - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JpaBaseConfiguration#entityManagerFactory matched: + - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JpaBaseConfiguration#entityManagerFactoryBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JpaBaseConfiguration#jpaVendorAdapter matched: + - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JpaBaseConfiguration#transactionManager matched: + - @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JpaBaseConfiguration.JpaWebConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (spring.jpa.open-in-view=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor,org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JpaBaseConfiguration.PersistenceManagedTypesConfiguration matched: + - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JpaBaseConfiguration.PersistenceManagedTypesConfiguration#persistenceManagedTypes matched: + - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JtaAutoConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.transaction.Transaction' (OnClassCondition) + - @ConditionalOnBooleanProperty (spring.jta.enabled=true) matched (OnPropertyCondition) + + JvmMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + JvmMetricsAutoConfiguration#classLoaderMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmCompilationMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmGcMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmHeapPressureMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmHeapPressureMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmInfoMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmMemoryMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmThreadMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + LifecycleAutoConfiguration#defaultLifecycleProcessor matched: + - @ConditionalOnMissingBean (names: lifecycleProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition) + + LogbackMetricsAutoConfiguration matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.MeterRegistry', 'ch.qos.logback.classic.LoggerContext', 'org.slf4j.LoggerFactory' (OnClassCondition) + - LogbackLoggingCondition ILoggerFactory is a Logback LoggerContext (LogbackMetricsAutoConfiguration.LogbackLoggingCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + LogbackMetricsAutoConfiguration#logbackMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.logging.LogbackMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ManagementContextAutoConfiguration.SameManagementContextConfiguration matched: + - Management Port actual port type (SAME) matched required type (OnManagementPortCondition) + + MetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.annotation.Timed' (OnClassCondition) + + MetricsAutoConfiguration#micrometerClock matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MetricsEndpointAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.annotation.Timed' (OnClassCondition) + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + + MetricsEndpointAutoConfiguration#metricsEndpoint matched: + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry'; @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.MetricsEndpoint; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MockMvcAutoConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + MockMvcConfiguration#mockMvc matched: + - @ConditionalOnMissingBean (types: org.springframework.test.web.servlet.MockMvc; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MockMvcConfiguration#mockMvcBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.test.web.servlet.MockMvcBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MockMvcTesterConfiguration matched: + - @ConditionalOnClass found required class 'org.assertj.core.api.Assert' (OnClassCondition) + + MockMvcTesterConfiguration#mockMvcTester matched: + - @ConditionalOnMissingBean (types: org.springframework.test.web.servlet.assertj.MockMvcTester; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.multipart.support.StandardServletMultipartResolver', 'jakarta.servlet.MultipartConfigElement' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (spring.servlet.multipart.enabled=true) matched (OnPropertyCondition) + + MultipartAutoConfiguration#multipartConfigElement matched: + - @ConditionalOnMissingBean (types: jakarta.servlet.MultipartConfigElement; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration#multipartResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + NamedParameterJdbcTemplateConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found a single bean 'jdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + NoOpCacheConfiguration matched: + - Cache org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration automatic cache type (CacheCondition) + + ObservationAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.observation.ObservationRegistry' (OnClassCondition) + + ObservationAutoConfiguration#observationRegistry matched: + - @ConditionalOnMissingBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration.MeterObservationHandlerConfiguration matched: + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.observation.MeterObservationHandler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration.MeterObservationHandlerConfiguration.OnlyMetricsMeterObservationHandlerConfiguration matched: + - @ConditionalOnMissingBean (types: ?; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration.OnlyMetricsConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry'; @ConditionalOnMissingClass did not find unwanted class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + PersistenceExceptionTranslationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor' (OnClassCondition) + + PersistenceExceptionTranslationAutoConfiguration#persistenceExceptionTranslationPostProcessor matched: + - @ConditionalOnBooleanProperty (spring.dao.exceptiontranslation.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer matched: + - @ConditionalOnMissingBean (types: org.springframework.context.support.PropertySourcesPlaceholderConfigurer; SearchStrategy: current) did not find any beans (OnBeanCondition) + + RepositoryMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.data.repository.Repository' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + RepositoryMetricsAutoConfiguration#metricsRepositoryMethodInvocationListener matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.data.MetricsRepositoryMethodInvocationListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RepositoryMetricsAutoConfiguration#repositoryTagsProvider matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.data.RepositoryTagsProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestClient' (OnClassCondition) + - AnyNestedCondition 1 matched 1 did not; NestedCondition on NotReactiveWebApplicationOrVirtualThreadsExecutorEnabledCondition.VirtualThreadsExecutorEnabled found non-matching nested conditions @ConditionalOnThreading did not find VIRTUAL; NestedCondition on NotReactiveWebApplicationOrVirtualThreadsExecutorEnabledCondition.NotReactiveWebApplication NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationOrVirtualThreadsExecutorEnabledCondition) + + RestClientAutoConfiguration#httpMessageConvertersRestClientCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.HttpMessageConvertersRestClientCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration#restClientBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.web.client.RestClient$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration#restClientBuilderConfigurer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.RestClientBuilderConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration#restClientSsl matched: + - @ConditionalOnBean (types: org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found bean 'sslBundleRegistry'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.RestClientSsl; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientObservationConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestClient' (OnClassCondition) + - @ConditionalOnBean (types: org.springframework.web.client.RestClient$Builder; SearchStrategy: all) found bean 'restClientBuilder' (OnBeanCondition) + + RestTemplateAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestTemplate' (OnClassCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition) + + RestTemplateAutoConfiguration#restTemplateBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.client.RestTemplateBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestTemplateObservationConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestTemplate' (OnClassCondition) + - @ConditionalOnBean (types: org.springframework.boot.web.client.RestTemplateBuilder; SearchStrategy: all) found bean 'restTemplateBuilder' (OnBeanCondition) + + ScheduledTasksObservabilityAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + ServletEndpointManagementContextConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + ServletEndpointManagementContextConfiguration.WebMvcServletEndpointManagementContextConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + + ServletManagementContextAutoConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.Servlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebServerFactoryAutoConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.ServletRequest' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebServerFactoryAutoConfiguration#tomcatServletWebServerFactoryCustomizer matched: + - @ConditionalOnClass found required class 'org.apache.catalina.startup.Tomcat' (OnClassCondition) + + ServletWebServerFactoryConfiguration.EmbeddedTomcat matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.apache.catalina.startup.Tomcat', 'org.apache.coyote.UpgradeProtocol' (OnClassCondition) + - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.server.ServletWebServerFactory; SearchStrategy: current) did not find any beans (OnBeanCondition) + + SimpleCacheConfiguration matched: + - Cache org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration automatic cache type (CacheCondition) + + SimpleMetricsExportAutoConfiguration matched: + - @ConditionalOnEnabledMetricsExport management.simple.metrics.export.enabled is true (OnMetricsExportEnabledCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) found bean 'micrometerClock'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SimpleMetricsExportAutoConfiguration#simpleConfig matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.simple.SimpleConfig; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SpringDataWebAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.data.web.PageableHandlerMethodArgumentResolver', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnMissingBean (types: org.springframework.data.web.PageableHandlerMethodArgumentResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SpringDataWebAutoConfiguration#pageableCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.data.web.config.PageableHandlerMethodArgumentResolverCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SpringDataWebAutoConfiguration#sortCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.data.web.config.SortHandlerMethodArgumentResolverCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SpringDataWebAutoConfiguration#springDataWebSettings matched: + - @ConditionalOnMissingBean (types: org.springframework.data.web.config.SpringDataWebSettings; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SqlInitializationAutoConfiguration matched: + - @ConditionalOnBooleanProperty (spring.sql.init.enabled=true) matched (OnPropertyCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on SqlInitializationAutoConfiguration.SqlInitializationModeCondition.ModeIsNever @ConditionalOnProperty (spring.sql.init.mode=never) did not find property 'spring.sql.init.mode' (SqlInitializationAutoConfiguration.SqlInitializationModeCondition) + + SslAutoConfiguration#sslBundleRegistry matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.ssl.SslBundleRegistry,org.springframework.boot.ssl.SslBundles; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslHealthContributorAutoConfiguration matched: + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + + SslHealthContributorAutoConfiguration#sslHealthIndicator matched: + - @ConditionalOnMissingBean (names: sslHealthIndicator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslHealthContributorAutoConfiguration#sslInfo matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.info.SslInfo; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslObservabilityAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry,org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found beans 'sslBundleRegistry', 'simpleMeterRegistry' (OnBeanCondition) + + StartupTimeMetricsListenerAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + StartupTimeMetricsListenerAutoConfiguration#startupTimeMetrics matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.startup.StartupTimeMetricsListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + SystemMetricsAutoConfiguration#diskSpaceMetrics matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.system.DiskSpaceMetricsBinder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#fileDescriptorMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#processorMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.ProcessorMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#uptimeMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.UptimeMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor' (OnClassCondition) + + TaskExecutorConfigurations.AsyncConfigurerConfiguration matched: + - @ConditionalOnMissingBean (types: org.springframework.scheduling.annotation.AsyncConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorConfigurations.AsyncConfigurerConfiguration#applicationTaskExecutorAsyncConfigurer matched: + - @ConditionalOnMissingBean (types: org.springframework.scheduling.annotation.AsyncConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration matched: + - AnyNestedCondition 1 matched 1 did not; NestedCondition on TaskExecutorConfigurations.OnExecutorCondition.ModelCondition @ConditionalOnProperty (spring.task.execution.mode=force) did not find property 'spring.task.execution.mode'; NestedCondition on TaskExecutorConfigurations.OnExecutorCondition.ExecutorBeanCondition @ConditionalOnMissingBean (types: java.util.concurrent.Executor; SearchStrategy: all) did not find any beans (TaskExecutorConfigurations.OnExecutorCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration#applicationTaskExecutor matched: + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskExecutorConfigurations.ThreadPoolTaskExecutorBuilderConfiguration#threadPoolTaskExecutorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics' (OnClassCondition) + - @ConditionalOnBean (types: java.util.concurrent.Executor,io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans 'applicationTaskExecutor', 'simpleMeterRegistry' (OnBeanCondition) + + TaskSchedulingAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskSchedulingConfigurations.ThreadPoolTaskSchedulerBuilderConfiguration#threadPoolTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TomcatMetricsAutoConfiguration matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.binder.tomcat.TomcatMetrics', 'org.apache.catalina.Manager' (OnClassCondition) + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + TomcatMetricsAutoConfiguration#tomcatMetricsBinder matched: + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.tomcat.TomcatMetrics,org.springframework.boot.actuate.metrics.web.tomcat.TomcatMetricsBinder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + TransactionAutoConfiguration.TransactionTemplateConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a single bean 'transactionManager' (OnBeanCondition) + + TransactionAutoConfiguration.TransactionTemplateConfiguration#transactionTemplate matched: + - @ConditionalOnMissingBean (types: org.springframework.transaction.support.TransactionOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionManagerCustomizationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + TransactionManagerCustomizationAutoConfiguration#platformTransactionManagerCustomizers matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ValidationAutoConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.validation.executable.ExecutableValidator' (OnClassCondition) + - @ConditionalOnResource found location classpath:META-INF/services/jakarta.validation.spi.ValidationProvider (OnResourceCondition) + + ValidationAutoConfiguration#defaultValidator matched: + - @ConditionalOnMissingBean (types: jakarta.validation.Validator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ValidationAutoConfiguration#methodValidationPostProcessor matched: + - @ConditionalOnMissingBean (types: org.springframework.validation.beanvalidation.MethodValidationPostProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + WebEndpointAutoConfiguration#controllerEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#endpointMediaTypes matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#pathMappedEndpoints matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#webEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration.WebEndpointServletConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + WebEndpointAutoConfiguration.WebEndpointServletConfiguration#servletEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration#formContentFilter matched: + - @ConditionalOnBooleanProperty (spring.mvc.formcontent.filter.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.filter.FormContentFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#flashMapManager matched: + - @ConditionalOnMissingBean (names: flashMapManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#localeResolver matched: + - @ConditionalOnMissingBean (names: localeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#themeResolver matched: + - @ConditionalOnMissingBean (names: themeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#viewNameTranslator matched: + - @ConditionalOnMissingBean (names: viewNameTranslator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#defaultViewResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.InternalResourceViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#requestContextFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.context.request.RequestContextListener,org.springframework.web.filter.RequestContextFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#viewResolver matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.ViewResolver; SearchStrategy: all) found beans 'defaultViewResolver', 'beanNameViewResolver', 'mvcViewResolver'; @ConditionalOnMissingBean (names: viewResolver types: org.springframework.web.servlet.view.ContentNegotiatingViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet,org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; SearchStrategy: all) found beans 'webEndpointDiscoverer', 'dispatcherServlet' (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#controllerEndpointHandlerMapping matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.servlet.ControllerEndpointHandlerMapping; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#endpointObjectMapperWebMvcConfigurer matched: + - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.jackson.EndpointObjectMapper; SearchStrategy: all) found bean 'endpointObjectMapper' (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#webEndpointServletHandlerMapping matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcObservationAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.web.servlet.DispatcherServlet', 'io.micrometer.observation.Observation' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + WebMvcObservationAutoConfiguration#webMvcObservationFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.filter.ServerHttpObservationFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcObservationAutoConfiguration.MeterFilterConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + WebSocketServletAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'jakarta.websocket.server.ServerContainer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + WebSocketServletAutoConfiguration.TomcatWebSocketConfiguration matched: + - @ConditionalOnClass found required classes 'org.apache.catalina.startup.Tomcat', 'org.apache.tomcat.websocket.server.WsSci' (OnClassCondition) + + WebSocketServletAutoConfiguration.TomcatWebSocketConfiguration#websocketServletWebServerCustomizer matched: + - @ConditionalOnMissingBean (names: websocketServletWebServerCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + +Negative matches: +----------------- + + ActiveMQAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) + + AopAutoConfiguration.AspectJAutoProxyingConfiguration.JdkDynamicAutoProxyConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=false) did not find property 'spring.aop.proxy-target-class' (OnPropertyCondition) + + AopAutoConfiguration.ClassProxyingConfiguration: + Did not match: + - @ConditionalOnMissingClass found unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition) + + AppOpticsMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.appoptics.AppOpticsMeterRegistry' (OnClassCondition) + + ArtemisAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) + + AtlasMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.atlas.AtlasMeterRegistry' (OnClassCondition) + + AuditAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; SearchStrategy: all) did not find any beans of type org.springframework.boot.actuate.audit.AuditEventRepository (OnBeanCondition) + Matched: + - @ConditionalOnBooleanProperty (management.auditevents.enabled=true) matched (OnPropertyCondition) + + AuditEventsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + AvailabilityHealthContributorAutoConfiguration#livenessStateHealthIndicator: + Did not match: + - @ConditionalOnBooleanProperty (management.health.livenessstate.enabled=true) did not find property 'management.health.livenessstate.enabled' (OnPropertyCondition) + + AvailabilityHealthContributorAutoConfiguration#readinessStateHealthIndicator: + Did not match: + - @ConditionalOnBooleanProperty (management.health.readinessstate.enabled=true) did not find property 'management.health.readinessstate.enabled' (OnPropertyCondition) + + AvailabilityProbesAutoConfiguration: + Did not match: + - Probes availability not running on a supported cloud platform (AvailabilityProbesAutoConfiguration.ProbesCondition) + + BatchAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.batch.core.launch.JobLauncher' (OnClassCondition) + + BatchObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.batch.core.configuration.annotation.BatchObservabilityBeanPostProcessor' (OnClassCondition) + + BeansEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + BraveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'brave.Tracer' (OnClassCondition) + + Cache2kCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.cache2k.Cache2kBuilder' (OnClassCondition) + + CacheAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.cache.interceptor.CacheAspectSupport; SearchStrategy: all) did not find any beans of type org.springframework.cache.interceptor.CacheAspectSupport (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.cache.CacheManager' (OnClassCondition) + + CacheAutoConfiguration.CacheManagerEntityManagerFactoryDependsOnPostProcessor: + Did not match: + - Ancestor org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.Cache2kCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'org.cache2k.Cache2kBuilder', 'org.cache2k.extra.spring.SpringCache2kCache', 'org.cache2k.extra.micrometer.Cache2kCacheMetrics' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.CaffeineCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'org.springframework.cache.caffeine.CaffeineCache', 'com.github.benmanes.caffeine.cache.Cache' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.HazelcastCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'com.hazelcast.spring.cache.HazelcastCache', 'com.hazelcast.core.Hazelcast' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.JCacheCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'org.springframework.cache.jcache.JCacheCache', 'javax.cache.CacheManager' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.RedisCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.cache.RedisCache' (OnClassCondition) + + CacheMetricsAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.cache.CacheManager; SearchStrategy: all) did not find any beans of type org.springframework.cache.CacheManager (OnBeanCondition) + + CachesEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.cache.CacheManager' (OnClassCondition) + + CaffeineCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.github.benmanes.caffeine.cache.Caffeine' (OnClassCondition) + + CassandraAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.cassandra.ReactiveSession' (OnClassCondition) + + CassandraRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + org.springframework.boot.autoconfigure.http.client.reactive.ClientHttpConnectorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Mono' (OnClassCondition) + + org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + CloudFoundryActuatorAutoConfiguration: + Did not match: + - @ConditionalOnCloudPlatform did not find CLOUD_FOUNDRY (OnCloudPlatformCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (management.cloudfoundry.enabled=true) matched (OnPropertyCondition) + + CodecsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + CompositeMeterRegistryConfiguration: + Did not match: + - NoneNestedConditions 1 matched 1 did not; NestedCondition on CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition.SingleInjectableMeterRegistry @ConditionalOnSingleCandidate (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found a single bean 'simpleMeterRegistry'; NestedCondition on CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition.NoMeterRegistryCondition @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' simpleMeterRegistry (CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition) + + ConditionsReportEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ConfigurationPropertiesReportEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ConnectionFactoryHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition) + + ConnectionPoolMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.pool.ConnectionPool' (OnClassCondition) + + CouchbaseAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Bucket' (OnClassCondition) + + CouchbaseHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Bucket' (OnClassCondition) + + DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration: + Did not match: + - EmbeddedDataSource found supported pooled data source (DataSourceAutoConfiguration.EmbeddedDatabaseCondition) + + DataSourceCheckpointRestoreConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.crac.Resource' (OnClassCondition) + + DataSourceConfiguration.Dbcp2: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition) + + DataSourceConfiguration.Generic: + Did not match: + - @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (OnPropertyCondition) + + DataSourceConfiguration.OracleUcp: + Did not match: + - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSourceImpl', 'oracle.jdbc.OracleConnection' (OnClassCondition) + + DataSourceConfiguration.Tomcat: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition) + + DataSourceJmxConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + + DataSourcePoolMetadataProvidersConfiguration.CommonsDbcp2PoolDataSourceMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition) + + DataSourcePoolMetadataProvidersConfiguration.OracleUcpPoolDataSourceMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSource', 'oracle.jdbc.OracleConnection' (OnClassCondition) + + DataSourcePoolMetadataProvidersConfiguration.TomcatDataSourcePoolMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition) + + DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration#transactionManager: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found beans of type 'org.springframework.transaction.TransactionManager' transactionManager (OnBeanCondition) + + DatadogMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.datadog.DatadogMeterRegistry' (OnClassCondition) + + DispatcherServletAutoConfiguration.DispatcherServletConfiguration#multipartResolver: + Did not match: + - @ConditionalOnBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans of type org.springframework.web.multipart.MultipartResolver (OnBeanCondition) + + DynatraceMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.dynatrace.DynatraceMeterRegistry' (OnClassCondition) + + ElasticMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.elastic.ElasticMeterRegistry' (OnClassCondition) + + ElasticsearchClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'co.elastic.clients.elasticsearch.ElasticsearchClient' (OnClassCondition) + + ElasticsearchDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate' (OnClassCondition) + + ElasticsearchReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ElasticsearchRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.elasticsearch.repository.ElasticsearchRepository' (OnClassCondition) + + ElasticsearchRestClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.elasticsearch.client.RestClientBuilder' (OnClassCondition) + + ElasticsearchRestHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.elasticsearch.client.RestClient' (OnClassCondition) + + EmbeddedLdapAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.unboundid.ldap.listener.InMemoryDirectoryServer' (OnClassCondition) + + EmbeddedWebServerFactoryCustomizerAutoConfiguration: + Did not match: + - Application is deployed as a WAR file. (OnWarDeploymentCondition) + Matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + EnvironmentEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ErrorWebFluxAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + FlywayAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.flywaydb.core.Flyway' (OnClassCondition) + + FlywayEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.flywaydb.core.Flyway' (OnClassCondition) + + FreeMarkerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'freemarker.template.Configuration' (OnClassCondition) + + GangliaMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.ganglia.GangliaMeterRegistry' (OnClassCondition) + + GraphQlAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlQueryByExampleAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlQuerydslAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.querydsl.core.Query' (OnClassCondition) + + GraphQlRSocketAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlReactiveQueryByExampleAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlReactiveQuerydslAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.querydsl.core.Query' (OnClassCondition) + + GraphQlWebFluxAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlWebFluxSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlWebMvcAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlWebMvcSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphiteMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.graphite.GraphiteMeterRegistry' (OnClassCondition) + + GroovyTemplateAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'groovy.text.markup.MarkupTemplateEngine' (OnClassCondition) + + GsonAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition) + + GsonHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition) + + H2ConsoleAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.h2.server.web.JakartaWebServlet' (OnClassCondition) + + HazelcastAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HazelcastCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HazelcastHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HazelcastJpaDependencyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HealthEndpointReactiveWebExtensionConfiguration: + Did not match: + - did not find reactive web application classes (OnWebApplicationCondition) + + HealthEndpointWebExtensionConfiguration.JerseyAdditionalHealthEndpointPathsConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + HeapDumpWebEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint the configured access for endpoint 'heapdump' is NONE (OnAvailableEndpointCondition) + + HibernateMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.hibernate.stat.HibernateMetrics' (OnClassCondition) + + HttpExchangesAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository; SearchStrategy: all) did not find any beans of type org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository (OnBeanCondition) + Matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (management.httpexchanges.recording.enabled=true) matched (OnPropertyCondition) + + HttpExchangesAutoConfiguration.ReactiveHttpExchangesConfiguration: + Did not match: + - did not find reactive web application classes (OnWebApplicationCondition) + - Ancestor org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + + HttpExchangesAutoConfiguration.ServletHttpExchangesConfiguration: + Did not match: + - Ancestor org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + Matched: + - found 'session' scope (OnWebApplicationCondition) + + HttpExchangesEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + HttpHandlerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.DispatcherHandler' (OnClassCondition) + + HumioMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.humio.HumioMeterRegistry' (OnClassCondition) + + HypermediaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.hateoas.EntityModel' (OnClassCondition) + + InfinispanCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.infinispan.spring.embedded.provider.SpringEmbeddedCacheManager' (OnClassCondition) + + InfluxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.influx.InfluxMeterRegistry' (OnClassCondition) + + InfoContributorAutoConfiguration#buildInfoContributor: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.boot.info.BuildProperties; SearchStrategy: all) did not find any beans (OnBeanCondition) + Matched: + - @ConditionalOnEnabledInfoContributor management.info.defaults.enabled is considered true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#envInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.env.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#gitInfoContributor: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.boot.info.GitProperties; SearchStrategy: all) did not find any beans (OnBeanCondition) + Matched: + - @ConditionalOnEnabledInfoContributor management.info.defaults.enabled is considered true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#javaInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.java.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#osInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.os.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#processInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.process.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#sslInfo: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.ssl.enabled is not true (OnEnabledInfoContributorCondition) + Matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.info.SslInfo; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InfoContributorAutoConfiguration#sslInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.ssl.enabled is not true (OnEnabledInfoContributorCondition) + + IntegrationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.integration.config.EnableIntegration' (OnClassCondition) + + IntegrationGraphEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.integration.graph.IntegrationGraphServer' (OnClassCondition) + + JCacheCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'javax.cache.Caching' (OnClassCondition) + + JacksonHttpMessageConvertersConfiguration.MappingJackson2XmlHttpMessageConverterConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.fasterxml.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JdbcRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration' (OnClassCondition) + + JerseyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.spring.SpringComponentProvider' (OnClassCondition) + + JerseySameManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + JerseyServerMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.micrometer.server.ObservationApplicationEventListener' (OnClassCondition) + + JerseyWebEndpointManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + JettyMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.eclipse.jetty.server.Server' (OnClassCondition) + + JmsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.Message' (OnClassCondition) + + JmsHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) + + JmxAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.jmx.export.MBeanExporter' (OnClassCondition) + + JmxEndpointAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + + JmxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.jmx.JmxMeterRegistry' (OnClassCondition) + + JndiConnectionFactoryAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jms.core.JmsTemplate' (OnClassCondition) + + JndiDataSourceAutoConfiguration: + Did not match: + - @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'spring.datasource.jndi-name' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition) + + JndiJtaConfiguration: + Did not match: + - @ConditionalOnJndi JNDI environment is not available (OnJndiCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.transaction.jta.JtaTransactionManager' (OnClassCondition) + + JooqAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.jooq.DSLContext' (OnClassCondition) + + JpaRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean,org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension; SearchStrategy: all) found beans of type 'org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean' &userRepository and found beans of type 'org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension' org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension#0 (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.data.jpa.repository.JpaRepository' (OnClassCondition) + - @ConditionalOnBooleanProperty (spring.data.jpa.repositories.enabled=true) matched (OnPropertyCondition) + + JsonbAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition) + + JsonbHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition) + + JvmMetricsAutoConfiguration#virtualThreadMetrics: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.java21.instrument.binder.jdk.VirtualThreadMetrics' (OnClassCondition) + + KafkaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.kafka.core.KafkaTemplate' (OnClassCondition) + + KafkaMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.kafka.core.ProducerFactory' (OnClassCondition) + + KairosMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.kairos.KairosMeterRegistry' (OnClassCondition) + + LdapAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.ldap.core.ContextSource' (OnClassCondition) + + LdapHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.ldap.core.LdapOperations' (OnClassCondition) + + LdapRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.ldap.repository.LdapRepository' (OnClassCondition) + + LettuceMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.lettuce.core.metrics.MicrometerCommandLatencyRecorder' (OnClassCondition) + + LiquibaseAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'liquibase.change.DatabaseChange' (OnClassCondition) + + LiquibaseEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'liquibase.integration.spring.SpringLiquibase' (OnClassCondition) + + Log4J2MetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.logging.log4j.core.LoggerContext' (OnClassCondition) + + LogFileWebEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + LoggersEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + MailHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.mail.javamail.JavaMailSenderImpl' (OnClassCondition) + + MailSenderAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.mail.internet.MimeMessage' (OnClassCondition) + + MailSenderValidatorAutoConfiguration: + Did not match: + - @ConditionalOnSingleCandidate did not find required type 'org.springframework.mail.javamail.JavaMailSenderImpl' (OnBeanCondition) + + ManagementContextAutoConfiguration.DifferentManagementContextConfiguration: + Did not match: + - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) + + ManagementWebSecurityAutoConfiguration: + Did not match: + - AllNestedConditions 1 matched 1 did not; NestedCondition on DefaultWebSecurityCondition.Beans @ConditionalOnMissingBean (types: ?; SearchStrategy: all) did not find any beans; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass did not find required classes 'org.springframework.security.web.SecurityFilterChain', 'org.springframework.security.config.annotation.web.builders.HttpSecurity' (DefaultWebSecurityCondition) + Matched: + - found 'session' scope (OnWebApplicationCondition) + + MappingsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + MessageSourceAutoConfiguration: + Did not match: + - ResourceBundle did not find bundle with basename messages (MessageSourceAutoConfiguration.ResourceBundleCondition) + + MetricsAspectsAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (management.observations.annotations.enabled=true) did not find property 'management.observations.annotations.enabled' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.MeterRegistry', 'org.aspectj.weaver.Advice' (OnClassCondition) + + MicrometerTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + MockMvcAutoConfiguration#dispatcherServlet: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found beans of type 'org.springframework.web.servlet.DispatcherServlet' dispatcherServlet (OnBeanCondition) + + MockMvcAutoConfiguration#dispatcherServletPath: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath; SearchStrategy: all) found beans of type 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath' dispatcherServletRegistration (OnBeanCondition) + + MockMvcAutoConfiguration.WebTestClientMockMvcConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + MockMvcSecurityConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors' (OnClassCondition) + + MockMvcWebClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.htmlunit.WebClient' (OnClassCondition) + + MockMvcWebDriverAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.openqa.selenium.htmlunit.HtmlUnitDriver' (OnClassCondition) + + MongoAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition) + + MongoDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition) + + MongoHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.mongodb.core.MongoTemplate' (OnClassCondition) + + MongoMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.MongoClientSettings' (OnClassCondition) + + MongoReactiveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition) + + MongoReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition) + + MongoReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + MongoReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition) + + MongoRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition) + + MustacheAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.samskivert.mustache.Mustache' (OnClassCondition) + + Neo4jAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + NettyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.netty.util.NettyRuntime' (OnClassCondition) + + NewRelicMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.newrelic.NewRelicMeterRegistry' (OnClassCondition) + + NoOpMeterRegistryConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' simpleMeterRegistry (OnBeanCondition) + + NoopTracerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + OAuth2AuthorizationServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.authorization.OAuth2Authorization' (OnClassCondition) + + OAuth2AuthorizationServerJwtAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.nimbusds.jose.jwk.source.JWKSource' (OnClassCondition) + + OAuth2ClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.client.registration.ClientRegistration' (OnClassCondition) + + OAuth2ClientWebSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition) + + OAuth2ResourceServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthenticationToken' (OnClassCondition) + + ObservationAutoConfiguration.MeterObservationHandlerConfiguration.TracingAndMetricsObservationHandlerConfiguration: + Did not match: + - @ConditionalOnBean did not find required type 'io.micrometer.tracing.Tracer' (OnBeanCondition) + - @ConditionalOnBean (types: ?; SearchStrategy: all) did not find any beans of type ? (OnBeanCondition) + + ObservationAutoConfiguration.MetricsWithTracingConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + ObservationAutoConfiguration.ObservedAspectConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (management.observations.annotations.enabled=true) did not find property 'management.observations.annotations.enabled' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + ObservationAutoConfiguration.OnlyTracingConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + OpenTelemetryAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.opentelemetry.sdk.OpenTelemetrySdk' (OnClassCondition) + + OpenTelemetryLoggingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.opentelemetry.api.OpenTelemetry' (OnClassCondition) + + OpenTelemetryTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.otel.bridge.OtelTracer' (OnClassCondition) + + OtlpLoggingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.opentelemetry.api.OpenTelemetry' (OnClassCondition) + + OtlpMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.registry.otlp.OtlpMeterRegistry' (OnClassCondition) + + OtlpTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.otel.bridge.OtelTracer' (OnClassCondition) + + ProjectInfoAutoConfiguration#buildProperties: + Did not match: + - @ConditionalOnResource did not find resource '${spring.info.build.location:classpath:META-INF/build-info.properties}' (OnResourceCondition) + + ProjectInfoAutoConfiguration#gitProperties: + Did not match: + - GitResource did not find git info at classpath:git.properties (ProjectInfoAutoConfiguration.GitResourceAvailableCondition) + + PrometheusExemplarsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + PrometheusMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.prometheusmetrics.PrometheusMeterRegistry' (OnClassCondition) + + PulsarAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.pulsar.client.api.PulsarClient' (OnClassCondition) + + PulsarReactiveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.pulsar.client.api.PulsarClient' (OnClassCondition) + + QuartzAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.quartz.Scheduler' (OnClassCondition) + + QuartzEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.quartz.Scheduler' (OnClassCondition) + + R2dbcAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition) + + R2dbcDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.r2dbc.core.R2dbcEntityTemplate' (OnClassCondition) + + R2dbcInitializationConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'io.r2dbc.spi.ConnectionFactory', 'org.springframework.r2dbc.connection.init.DatabasePopulator' (OnClassCondition) + + R2dbcObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.proxy.ProxyConnectionFactory' (OnClassCondition) + + R2dbcProxyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.proxy.ProxyConnectionFactory' (OnClassCondition) + + R2dbcRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition) + + R2dbcTransactionManagerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.r2dbc.connection.R2dbcTransactionManager' (OnClassCondition) + + RSocketGraphQlClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + RSocketMessagingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.rsocket.RSocket' (OnClassCondition) + + RSocketRequesterAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.rsocket.RSocket' (OnClassCondition) + + RSocketSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.rsocket.core.SecuritySocketAcceptorInterceptor' (OnClassCondition) + + RSocketServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.rsocket.core.RSocketServer' (OnClassCondition) + + RSocketStrategiesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.netty.buffer.PooledByteBufAllocator' (OnClassCondition) + + RabbitAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.rabbitmq.client.Channel' (OnClassCondition) + + RabbitHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.amqp.rabbit.core.RabbitTemplate' (OnClassCondition) + + RabbitMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.rabbitmq.client.ConnectionFactory' (OnClassCondition) + + ReactiveCloudFoundryActuatorAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + ReactiveElasticsearchClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'co.elastic.clients.transport.ElasticsearchTransport' (OnClassCondition) + + ReactiveElasticsearchRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Mono' (OnClassCondition) + + ReactiveHealthEndpointConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveManagementContextAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveManagementWebSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity' (OnClassCondition) + + ReactiveMultipartAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + ReactiveOAuth2ClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveOAuth2ClientWebSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveOAuth2ResourceServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity' (OnClassCondition) + + ReactiveSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveUserDetailsServiceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.authentication.ReactiveAuthenticationManager' (OnClassCondition) + + ReactiveWebServerFactoryAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + ReactorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Hooks' (OnClassCondition) + + RedisAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.core.RedisOperations' (OnClassCondition) + + RedisCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.connection.RedisConnectionFactory' (OnClassCondition) + + RedisHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.connection.RedisConnectionFactory' (OnClassCondition) + + RedisReactiveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + RedisReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + RedisRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.repository.configuration.EnableRedisRepositories' (OnClassCondition) + + RepositoryRestMvcAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration' (OnClassCondition) + + Saml2RelyingPartyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (OnClassCondition) + + SbomEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ScheduledTasksEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + SecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.authentication.DefaultAuthenticationEventPublisher' (OnClassCondition) + + SecurityFilterAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.http.SessionCreationPolicy' (OnClassCondition) + + SecurityRequestMatchersManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.web.util.matcher.RequestMatcher' (OnClassCondition) + + SendGridAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.sendgrid.SendGrid' (OnClassCondition) + + ServletEndpointManagementContextConfiguration.JerseyServletEndpointManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + ServletManagementContextAutoConfiguration.ApplicationContextFilterConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (management.server.add-application-context-header=true) did not find property 'management.server.add-application-context-header' (OnPropertyCondition) + + ServletWebServerFactoryAutoConfiguration.ForwardedHeaderFilterConfiguration: + Did not match: + - @ConditionalOnProperty (server.forward-headers-strategy=framework) did not find property 'server.forward-headers-strategy' (OnPropertyCondition) + + ServletWebServerFactoryConfiguration.EmbeddedJetty: + Did not match: + - @ConditionalOnClass did not find required classes 'org.eclipse.jetty.server.Server', 'org.eclipse.jetty.util.Loader', 'org.eclipse.jetty.ee10.webapp.WebAppContext' (OnClassCondition) + + ServletWebServerFactoryConfiguration.EmbeddedUndertow: + Did not match: + - @ConditionalOnClass did not find required classes 'io.undertow.Undertow', 'org.xnio.SslClientAuthMode' (OnClassCondition) + + SessionAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.session.Session' (OnClassCondition) + + SessionsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.session.Session' (OnClassCondition) + + ShutdownEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint the configured access for endpoint 'shutdown' is NONE (OnAvailableEndpointCondition) + + SignalFxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.signalfx.SignalFxMeterRegistry' (OnClassCondition) + + SpringApplicationAdminJmxAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.application.admin.enabled=true) did not find property 'spring.application.admin.enabled' (OnPropertyCondition) + + SslObservabilityAutoConfiguration#sslInfoProvider: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.info.SslInfo; SearchStrategy: all) found beans of type 'org.springframework.boot.info.SslInfo' sslInfo (OnBeanCondition) + + StackdriverMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.stackdriver.StackdriverMeterRegistry' (OnClassCondition) + + StartupEndpointAutoConfiguration: + Did not match: + - ApplicationStartup configured applicationStartup is of type class org.springframework.core.metrics.DefaultApplicationStartup, expected BufferingApplicationStartup. (StartupEndpointAutoConfiguration.ApplicationStartupCondition) + + StatsdMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.statsd.StatsdMeterRegistry' (OnClassCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilderVirtualThreads: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder' simpleAsyncTaskExecutorBuilder (OnBeanCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration#applicationTaskExecutorVirtualThreads: + Did not match: + - @ConditionalOnThreading did not find VIRTUAL (OnThreadingCondition) + + TaskSchedulingAutoConfiguration#scheduledBeanLazyInitializationExcludeFilter: + Did not match: + - @ConditionalOnBean (names: org.springframework.context.annotation.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.context.annotation.internalScheduledAnnotationProcessor (OnBeanCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilderVirtualThreads: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder' simpleAsyncTaskSchedulerBuilder (OnBeanCondition) + + TaskSchedulingConfigurations.TaskSchedulerConfiguration: + Did not match: + - @ConditionalOnBean (names: org.springframework.context.annotation.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.context.annotation.internalScheduledAnnotationProcessor (OnBeanCondition) + + ThreadDumpEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ThymeleafAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.thymeleaf.spring6.SpringTemplateEngine' (OnClassCondition) + + TransactionAutoConfiguration#transactionalOperator: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.transaction.ReactiveTransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration.AspectJTransactionManagementConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.transaction.aspectj.AbstractTransactionAspect; SearchStrategy: all) did not find any beans of type org.springframework.transaction.aspectj.AbstractTransactionAspect (OnBeanCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) found beans of type 'org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration' org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration (OnBeanCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration: + Did not match: + - Ancestor org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$EnableTransactionManagementConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + Matched: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration.JdkDynamicAutoProxyConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=false) did not find property 'spring.aop.proxy-target-class' (OnPropertyCondition) + - Ancestor org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$EnableTransactionManagementConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + + UserDetailsServiceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.authentication.AuthenticationManager' (OnClassCondition) + + WavefrontAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.wavefront.sdk.common.application.ApplicationTags' (OnClassCondition) + + WavefrontMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.wavefront.sdk.common.WavefrontSender' (OnClassCondition) + + WavefrontTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.wavefront.sdk.common.WavefrontSender' (OnClassCondition) + + WebClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + WebClientObservationConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + WebFluxAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + WebFluxEndpointManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.DispatcherHandler' (OnClassCondition) + + WebFluxObservationAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + WebMvcAutoConfiguration#hiddenHttpMethodFilter: + Did not match: + - @ConditionalOnBooleanProperty (spring.mvc.hiddenmethod.filter.enabled=true) did not find property 'spring.mvc.hiddenmethod.filter.enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.ProblemDetailsErrorHandlingConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.mvc.problemdetails.enabled=true) did not find property 'spring.mvc.problemdetails.enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.ResourceChainCustomizerConfiguration: + Did not match: + - @ConditionalOnEnabledResourceChain did not find class org.webjars.WebJarVersionLocator (OnEnabledResourceChainCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#beanNameViewResolver: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) found beans of type 'org.springframework.web.servlet.view.BeanNameViewResolver' beanNameViewResolver (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#managementHealthEndpointWebMvcHandlerMapping: + Did not match: + - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) + + WebServiceTemplateAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.oxm.Marshaller' (OnClassCondition) + + WebServicesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.ws.transport.http.MessageDispatcherServlet' (OnClassCondition) + + WebSessionIdResolverAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Mono' (OnClassCondition) + + WebSocketMessagingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer' (OnClassCondition) + + WebSocketReactiveAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + WebSocketServletAutoConfiguration.JettyWebSocketConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer' (OnClassCondition) + + WebSocketServletAutoConfiguration.UndertowWebSocketConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.undertow.websockets.jsr.Bootstrap' (OnClassCondition) + + WebTestClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + XADataSourceAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.boot.jdbc.XADataSourceWrapper; SearchStrategy: all) did not find any beans of type org.springframework.boot.jdbc.XADataSourceWrapper (OnBeanCondition) + Matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'jakarta.transaction.TransactionManager', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition) + + ZipkinAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'zipkin2.reporter.Encoding' (OnClassCondition) + + +Exclusions: +----------- + + None + + +Unconditional classes: +---------------------- + + org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration + + org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration + + org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration + + org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.metrics.integration.IntegrationMetricsAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.endpoint.jackson.JacksonEndpointAutoConfiguration + + org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration + + org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration + + + +2025-10-10 15:03:33.437 [main] DEBUG o.s.b.d.LoggingFailureAnalysisReporter - Application failed to start due to an exception +org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class + at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:176) + at org.springframework.boot.autoconfigure.jdbc.PropertiesJdbcConnectionDetails.getDriverClassName(PropertiesJdbcConnectionDetails.java:49) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:62) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:127) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:89) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1698) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1643) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:913) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:159) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:388) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:382) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:382) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:293) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:292) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:281) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:280) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:27) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:112) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:111) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39) + at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25) + at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:63) + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:231) + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) +2025-10-10 15:03:33.440 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. + +Reason: Failed to determine a suitable driver class + + +Action: + +Consider the following: + If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. + If you have database settings to be loaded from a particular profile you may need to activate it (the profiles test are currently active). + +2025-10-10 15:03:33.445 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5e37fb82 size = 0, maxSize = 32, parentContextCount = 0, hitCount = 0, missCount = 1, failureCount = 1] +2025-10-10 15:03:33.445 [main] WARN o.s.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] to prepare test instance [com.deepchart.integration.ApiSignIntegrationTest@59ec7020] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@426710f0 testClass = com.deepchart.integration.ApiSignIntegrationTest, locations = [], classes = [com.deepchart.DeepchartApplication], contextInitializerClasses = [], activeProfiles = ["test"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [[ImportsContextCustomizer@5c5a91b4 key = [org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientWebSecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@57db2b13, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@71687585, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@12591ac8, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@49c90a9c, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6e2aa843, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@4b3fa0b3, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@10289886, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@6c00a450], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:159) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:388) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:382) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:382) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:293) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:292) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:281) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:280) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:27) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:112) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:111) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39) + at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25) + at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:63) + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:231) + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Failed to initialize dependency 'dataSourceScriptDatabaseInitializer' of LoadTimeWeaverAware bean 'entityManagerFactory': Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception with message: Failed to determine a suitable driver class + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:328) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 78 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception with message: Failed to determine a suitable driver class + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) + ... 93 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception with message: Failed to determine a suitable driver class + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1698) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1643) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:913) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 103 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception with message: Failed to determine a suitable driver class + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:200) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:89) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + ... 116 common frames omitted +Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class + at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:176) + at org.springframework.boot.autoconfigure.jdbc.PropertiesJdbcConnectionDetails.getDriverClassName(PropertiesJdbcConnectionDetails.java:49) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:62) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:127) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172) + ... 119 common frames omitted +2025-10-10 15:03:33.477 [main] DEBUG o.s.t.c.s.DirtiesContextTestExecutionListener - After test class: class [ApiSignIntegrationTest], class annotated with @DirtiesContext [false] with mode [null] diff --git a/pom.xml b/pom.xml index 389c67b..30248ab 100644 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,12 @@ spring-boot-starter-test test + + org.testng + testng + RELEASE + compile + diff --git a/src/test/java/com/deepchart/common/sign/ApiSignPropertiesTest.java b/src/test/java/com/deepchart/common/sign/ApiSignPropertiesTest.java new file mode 100644 index 0000000..b89701d --- /dev/null +++ b/src/test/java/com/deepchart/common/sign/ApiSignPropertiesTest.java @@ -0,0 +1,110 @@ +package com.deepchart.common.sign; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@DisplayName("API签名配置测试") +class ApiSignPropertiesTest { + + private ApiSignProperties apiSignProperties; + + @BeforeEach + void setUp() { + apiSignProperties = new ApiSignProperties(); + + Map appSecrets = new HashMap<>(); + appSecrets.put("web-app", "web_secret_123"); + appSecrets.put("mobile-app", "mobile_secret_456"); + appSecrets.put("third-party", "third_party_secret_789"); + + apiSignProperties.setAppSecrets(appSecrets); + apiSignProperties.setEnabled(true); + apiSignProperties.setExpireTime(300000L); + apiSignProperties.setIncludePatterns(new String[]{"/api/**"}); + apiSignProperties.setExcludePatterns(new String[]{"/api/public/**"}); + } + + @Test + @DisplayName("获取应用密钥 - 存在") + void testGetAppSecret_Exists() { + // 执行 + String secret = apiSignProperties.getAppSecret("web-app"); + + // 验证 + assertEquals("web_secret_123", secret); + } + + @Test + @DisplayName("获取应用密钥 - 不存在") + void testGetAppSecret_NotExists() { + // 执行 + String secret = apiSignProperties.getAppSecret("non-existent-app"); + + // 验证 + assertNull(secret); + } + + @Test + @DisplayName("检查应用ID - 存在") + void testContainsAppId_Exists() { + // 执行 & 验证 + assertTrue(apiSignProperties.containsAppId("web-app")); + assertTrue(apiSignProperties.containsAppId("mobile-app")); + assertTrue(apiSignProperties.containsAppId("third-party")); + } + + @Test + @DisplayName("检查应用ID - 不存在") + void testContainsAppId_NotExists() { + // 执行 & 验证 + assertFalse(apiSignProperties.containsAppId("non-existent-app")); + assertFalse(apiSignProperties.containsAppId("")); + assertFalse(apiSignProperties.containsAppId(null)); + } + + @Test + @DisplayName("默认值测试") + void testDefaultValues() { + // 准备 + ApiSignProperties defaultProperties = new ApiSignProperties(); + + // 验证 + assertTrue(defaultProperties.isEnabled()); + assertEquals(300000L, defaultProperties.getExpireTime()); + assertNotNull(defaultProperties.getAppSecrets()); + assertNotNull(defaultProperties.getIncludePatterns()); + assertNotNull(defaultProperties.getExcludePatterns()); + } + + @Test + @DisplayName("Setter/Getter测试") + void testSettersAndGetters() { + // 准备 + ApiSignProperties properties = new ApiSignProperties(); + + // 执行 + properties.setEnabled(false); + properties.setExpireTime(600000L); + properties.setIncludePatterns(new String[]{"/secure/**"}); + properties.setExcludePatterns(new String[]{"/secure/public/**"}); + + Map secrets = new HashMap<>(); + secrets.put("test-app", "test_secret"); + properties.setAppSecrets(secrets); + + // 验证 + assertFalse(properties.isEnabled()); + assertEquals(600000L, properties.getExpireTime()); + assertArrayEquals(new String[]{"/secure/**"}, properties.getIncludePatterns()); + assertArrayEquals(new String[]{"/secure/public/**"}, properties.getExcludePatterns()); + assertEquals("test_secret", properties.getAppSecret("test-app")); + } +} \ No newline at end of file diff --git a/src/test/java/com/deepchart/common/sign/SignInterceptorTest.java b/src/test/java/com/deepchart/common/sign/SignInterceptorTest.java new file mode 100644 index 0000000..a9a15f8 --- /dev/null +++ b/src/test/java/com/deepchart/common/sign/SignInterceptorTest.java @@ -0,0 +1,266 @@ +package com.deepchart.common.sign; + +import com.deepchart.common.exception.SignatureException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.util.AntPathMatcher; + +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@DisplayName("签名拦截器测试") +class SignInterceptorTest { + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + @Mock + private Object handler; + + private ApiSignProperties apiSignProperties; + private SignInterceptor signInterceptor; + + @BeforeEach + void setUp() { + apiSignProperties = new ApiSignProperties(); + apiSignProperties.setEnabled(true); + + Map appSecrets = new HashMap<>(); + appSecrets.put("web-app", "web_app_secret_2024"); + appSecrets.put("mobile-app", "mobile_app_secret_2024"); + apiSignProperties.setAppSecrets(appSecrets); + + apiSignProperties.setIncludePatterns(new String[]{"/api/**"}); + apiSignProperties.setExcludePatterns(new String[]{"/api/actuator/**", "/api/public/**"}); + + signInterceptor = new SignInterceptor(apiSignProperties); + } + + @Test + @DisplayName("拦截器 - 签名验证通过") + void testPreHandle_Success() throws Exception { + // 准备 + when(request.getRequestURI()).thenReturn("/api/users"); + setupValidSignatureHeaders(); + + // 执行 + boolean result = signInterceptor.preHandle(request, response, handler); + + // 验证 + assertTrue(result, "签名验证通过应返回true"); + } + + @Test + @DisplayName("拦截器 - 签名验证失败") + void testPreHandle_SignatureFailed() { + // 准备 + when(request.getRequestURI()).thenReturn("/api/users"); + setupInvalidSignatureHeaders(); + + // 执行 & 验证 + SignatureException exception = assertThrows(SignatureException.class, + () -> signInterceptor.preHandle(request, response, handler)); + + assertEquals("签名验证失败", exception.getMessage()); + } + + @Test + @DisplayName("拦截器 - 无效appId") + void testPreHandle_InvalidAppId() { + // 准备 + when(request.getRequestURI()).thenReturn("/api/users"); + setupHeadersWithInvalidAppId(); + + // 执行 & 验证 + SignatureException exception = assertThrows(SignatureException.class, + () -> signInterceptor.preHandle(request, response, handler)); + + assertEquals("应用ID无效", exception.getMessage()); + } + + @Test + @DisplayName("拦截器 - 缺少必要参数") + void testPreHandle_MissingRequiredParams() { + // 准备 + when(request.getRequestURI()).thenReturn("/api/users"); + setupHeadersWithMissingParams(); + + // 执行 & 验证 + SignatureException exception = assertThrows(SignatureException.class, + () -> signInterceptor.preHandle(request, response, handler)); + + assertEquals("签名参数缺失", exception.getMessage()); + } + + @Test + @DisplayName("拦截器 - 排除路径不验证") + void testPreHandle_ExcludedPath() throws Exception { + // 准备 + when(request.getRequestURI()).thenReturn("/api/actuator/health"); + + // 执行 + boolean result = signInterceptor.preHandle(request, response, handler); + + // 验证 + assertTrue(result, "排除路径应直接通过"); + verify(request, never()).getHeader(anyString()); + } + + @Test + @DisplayName("拦截器 - 非包含路径不验证") + void testPreHandle_NotIncludedPath() throws Exception { + // 准备 + when(request.getRequestURI()).thenReturn("/other/path"); + + // 执行 + boolean result = signInterceptor.preHandle(request, response, handler); + + // 验证 + assertTrue(result, "非包含路径应直接通过"); + verify(request, never()).getHeader(anyString()); + } + + @Test + @DisplayName("拦截器 - 签名验证禁用") + void testPreHandle_SignDisabled() throws Exception { + // 准备 + apiSignProperties.setEnabled(false); + when(request.getRequestURI()).thenReturn("/api/users"); + + // 执行 + boolean result = signInterceptor.preHandle(request, response, handler); + + // 验证 + assertTrue(result, "签名验证禁用时应直接通过"); + verify(request, never()).getHeader(anyString()); + } + + @Test + @DisplayName("提取签名参数 - 从Header") + void testExtractSignParams_FromHeaders() { + // 准备 + setupValidSignatureHeaders(); + + // 执行 - 通过反射调用私有方法 + Map params = extractSignParams(); + + // 验证 + assertNotNull(params); + assertEquals("web-app", params.get("appid")); + assertEquals("1640995200000", params.get("timestamp")); + assertEquals("abc123def456", params.get("nonce")); + assertEquals("valid_signature", params.get("sign")); + } + + @Test + @DisplayName("提取签名参数 - 从URL参数") + void testExtractSignParams_FromParameters() { + // 准备 + when(request.getRequestURI()).thenReturn("/api/users"); + + // 设置URL参数 + when(request.getParameter("appId")).thenReturn("web-app"); + when(request.getParameter("timestamp")).thenReturn("1640995200000"); + when(request.getParameter("nonce")).thenReturn("abc123def456"); + when(request.getParameter("sign")).thenReturn("valid_signature"); + + // 执行 - 通过反射调用私有方法 + Map params = extractSignParams(); + + // 验证 + assertNotNull(params); + assertEquals("web-app", params.get("appid")); + assertEquals("1640995200000", params.get("timestamp")); + assertEquals("abc123def456", params.get("nonce")); + assertEquals("valid_signature", params.get("sign")); + } + + // 辅助方法:设置有效的签名Header + private void setupValidSignatureHeaders() { + Map headers = new HashMap<>(); + headers.put("X-API-APPID", "web-app"); + headers.put("X-API-TIMESTAMP", "1640995200000"); + headers.put("X-API-NONCE", "abc123def456"); + headers.put("X-API-SIGN", "valid_signature"); + + setupHeaders(headers); + + // 设置签名验证通过 + Map signParams = new HashMap<>(); + signParams.put("appid", "web-app"); + signParams.put("timestamp", "1640995200000"); + signParams.put("nonce", "abc123def456"); + signParams.put("sign", "valid_signature"); + + // 这里需要模拟SignUtil.verifySign返回true + // 实际项目中可以使用PowerMock或重构代码使其可测试 + } + + // 辅助方法:设置无效的签名Header + private void setupInvalidSignatureHeaders() { + Map headers = new HashMap<>(); + headers.put("X-API-APPID", "web-app"); + headers.put("X-API-TIMESTAMP", "1640995200000"); + headers.put("X-API-NONCE", "abc123def456"); + headers.put("X-API-SIGN", "invalid_signature"); + + setupHeaders(headers); + } + + // 辅助方法:设置无效的appId + private void setupHeadersWithInvalidAppId() { + Map headers = new HashMap<>(); + headers.put("X-API-APPID", "invalid-app"); + headers.put("X-API-TIMESTAMP", "1640995200000"); + headers.put("X-API-NONCE", "abc123def456"); + headers.put("X-API-SIGN", "some_signature"); + + setupHeaders(headers); + } + + // 辅助方法:设置缺少参数的Header + private void setupHeadersWithMissingParams() { + Map headers = new HashMap<>(); + headers.put("X-API-APPID", "web-app"); + // 缺少timestamp、nonce、sign + + setupHeaders(headers); + } + + // 辅助方法:设置Header + private void setupHeaders(Map headers) { + Vector headerNames = new Vector<>(headers.keySet()); + when(request.getHeaderNames()).thenReturn(headerNames.elements()); + + for (Map.Entry entry : headers.entrySet()) { + when(request.getHeader(entry.getKey())).thenReturn(entry.getValue()); + } + } + + // 辅助方法:通过反射调用私有方法extractSignParams + private Map extractSignParams() { + try { + var method = SignInterceptor.class.getDeclaredMethod("extractSignParams", HttpServletRequest.class); + method.setAccessible(true); + return (Map) method.invoke(signInterceptor, request); + } catch (Exception e) { + throw new RuntimeException("反射调用失败", e); + } + } +} diff --git a/src/test/java/com/deepchart/common/sign/SignUtilTest.java b/src/test/java/com/deepchart/common/sign/SignUtilTest.java new file mode 100644 index 0000000..bdbd5fd --- /dev/null +++ b/src/test/java/com/deepchart/common/sign/SignUtilTest.java @@ -0,0 +1,260 @@ +package com.deepchart.common.sign; + +import com.deepchart.common.util.SignUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("签名工具测试") +class SignUtilTest { + + private static final String APP_SECRET = "test_secret_2024"; + private Map testParams; + + @BeforeEach + void setUp() { + testParams = new HashMap<>(); + testParams.put("appId", "test-app"); + testParams.put("timestamp", String.valueOf(System.currentTimeMillis())); + testParams.put("nonce", "abc123def456"); + testParams.put("username", "testuser"); + testParams.put("email", "test@example.com"); + } + + @Test + @DisplayName("生成签名 - 正常情况") + void testGenerateSign_NormalCase() { + // 执行 + String sign = SignUtil.generateSign(testParams, APP_SECRET); + + // 验证 + assertNotNull(sign, "签名不应为null"); + assertEquals(32, sign.length(), "MD5签名长度应为32"); + assertTrue(sign.matches("^[a-f0-9]{32}$"), "签名应为32位十六进制字符串"); + } + + @Test + @DisplayName("生成签名 - 参数排序") + void testGenerateSign_ParameterOrder() { + // 准备不同顺序的参数 + Map params1 = new HashMap<>(); + params1.put("z", "value1"); + params1.put("a", "value2"); + params1.put("m", "value3"); + + Map params2 = new HashMap<>(); + params2.put("a", "value2"); + params2.put("m", "value3"); + params2.put("z", "value1"); + + // 执行 + String sign1 = SignUtil.generateSign(params1, APP_SECRET); + String sign2 = SignUtil.generateSign(params2, APP_SECRET); + + // 验证 + assertEquals(sign1, sign2, "不同参数顺序应生成相同签名"); + System.out.println("sign1: " + sign1); + System.out.println("sign2: " + sign2); + } + + @Test + @DisplayName("验证签名 - 正确签名") + void testVerifySign_CorrectSign() { + // 准备 + String sign = SignUtil.generateSign(testParams, APP_SECRET); + testParams.put("sign", sign); + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, sign); + + // 验证 + assertTrue(isValid, "正确签名应验证通过"); + } + + @Test + @DisplayName("验证签名 - 错误签名") + void testVerifySign_WrongSign() { + // 准备 + String correctSign = SignUtil.generateSign(testParams, APP_SECRET); + String wrongSign = "wrong_signature_1234567890"; + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, wrongSign); + + // 验证 + assertFalse(isValid, "错误签名应验证失败"); + } + + @Test + @DisplayName("验证签名 - 过期时间戳") + void testVerifySign_ExpiredTimestamp() { + // 准备过期时间戳(超过5分钟) + long expiredTimestamp = System.currentTimeMillis() - 6 * 60 * 1000; + testParams.put("timestamp", String.valueOf(expiredTimestamp)); + + String sign = SignUtil.generateSign(testParams, APP_SECRET); + testParams.put("sign", sign); + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, sign); + + // 验证 + assertFalse(isValid, "过期时间戳应验证失败"); + } + + @Test + @DisplayName("验证签名 - 未来时间戳") + void testVerifySign_FutureTimestamp() { + // 准备未来时间戳(超过5分钟) + long futureTimestamp = System.currentTimeMillis() + 6 * 60 * 1000; + testParams.put("timestamp", String.valueOf(futureTimestamp)); + + String sign = SignUtil.generateSign(testParams, APP_SECRET); + testParams.put("sign", sign); + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, sign); + + // 验证 + assertFalse(isValid, "未来时间戳应验证失败"); + } + + @Test + @DisplayName("验证签名 - 无效时间戳格式") + void testVerifySign_InvalidTimestampFormat() { + // 准备无效时间戳 + testParams.put("timestamp", "invalid_timestamp"); + + String sign = SignUtil.generateSign(testParams, APP_SECRET); + testParams.put("sign", sign); + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, sign); + + // 验证 + assertFalse(isValid, "无效时间戳格式应验证失败"); + } + + @Test + @DisplayName("验证签名 - 缺少时间戳") + void testVerifySign_MissingTimestamp() { + // 准备缺少时间戳的参数 + testParams.remove("timestamp"); + + String sign = SignUtil.generateSign(testParams, APP_SECRET); + testParams.put("sign", sign); + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, sign); + + // 验证 + assertFalse(isValid, "缺少时间戳应验证失败"); + } + + @Test + @DisplayName("验证签名 - 无效nonce") + void testVerifySign_InvalidNonce() { + // 准备无效nonce + testParams.put("nonce", "short"); // 太短的nonce + + String sign = SignUtil.generateSign(testParams, APP_SECRET); + testParams.put("sign", sign); + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, sign); + + // 验证 + assertFalse(isValid, "无效nonce应验证失败"); + } + + @ParameterizedTest + @NullAndEmptySource + @DisplayName("验证签名 - 空或null参数值") + void testVerifySign_NullOrEmptyParams(String value) { + // 准备空或null参数 + testParams.put("nonce", value); + + String sign = SignUtil.generateSign(testParams, APP_SECRET); + testParams.put("sign", sign); + + // 执行 + boolean isValid = SignUtil.verifySign(testParams, APP_SECRET, sign); + + // 验证 + assertFalse(isValid, "空或null参数应验证失败"); + } + + @Test + @DisplayName("生成随机字符串") + void testGenerateNonce() { + // 执行 + String nonce1 = SignUtil.generateNonce(); + String nonce2 = SignUtil.generateNonce(); + + // 验证 + assertNotNull(nonce1, "nonce不应为null"); + assertNotNull(nonce2, "nonce不应为null"); + assertEquals(16, nonce1.length(), "nonce长度应为16"); + assertEquals(16, nonce2.length(), "nonce长度应为16"); + assertNotEquals(nonce1, nonce2, "两次生成的nonce应不同"); + assertTrue(nonce1.matches("^[a-f0-9]{16}$"), "nonce应为16位十六进制字符串"); + System.out.println(nonce1); + System.out.println(nonce2); + } + + @Test + @DisplayName("获取当前时间戳") + void testGetCurrentTimestamp() { + // 执行 + String timestamp = SignUtil.getCurrentTimestamp(); + long currentTime = System.currentTimeMillis(); + + // 验证 + assertNotNull(timestamp, "时间戳不应为null"); + long parsedTimestamp = Long.parseLong(timestamp); + assertTrue(Math.abs(currentTime - parsedTimestamp) < 1000, + "生成的时间戳应与当前时间相近"); + System.out.println(timestamp); + } + + @Test + @DisplayName("生成签名 - 空参数") + void testGenerateSign_EmptyParams() { + // 准备空参数 + Map emptyParams = new HashMap<>(); + emptyParams.put("appId", "test-app"); + emptyParams.put("timestamp", String.valueOf(System.currentTimeMillis())); + emptyParams.put("nonce", "abc123def456"); + + // 执行 + String sign = SignUtil.generateSign(emptyParams, APP_SECRET); + + // 验证 + assertNotNull(sign, "空参数也应生成签名"); + assertEquals(32, sign.length(), "签名长度应为32"); + System.out.println("签名: "+ sign); + } + + @Test + @DisplayName("生成签名 - 特殊字符参数") + void testGenerateSign_SpecialCharacters() { + // 准备包含特殊字符的参数 + testParams.put("special", "!@#$%^&*()_+-=[]{}|;:,.<>?"); + testParams.put("unicode", "中文测试"); + testParams.put("space", "value with spaces"); + + // 执行 + String sign = SignUtil.generateSign(testParams, APP_SECRET); + + // 验证 + assertNotNull(sign, "特殊字符参数应生成签名"); + assertEquals(32, sign.length(), "签名长度应为32"); + } +} diff --git a/src/test/java/com/deepchart/controller/PublicControllerTest.java b/src/test/java/com/deepchart/controller/PublicControllerTest.java new file mode 100644 index 0000000..5d876dc --- /dev/null +++ b/src/test/java/com/deepchart/controller/PublicControllerTest.java @@ -0,0 +1,52 @@ +package com.deepchart.controller; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(PublicController.class) +@DisplayName("公开接口控制器测试") +class PublicControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + @DisplayName("获取服务器时间 - 无需签名") + void testGetServerTimestamp_NoSignatureRequired() throws Exception { + // 执行 & 验证 - 不需要签名Header + mockMvc.perform(get("/api/public/timestamp")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.timestamp").exists()) + .andExpect(jsonPath("$.data.timezone").value("Asia/Shanghai")); + } + + @Test + @DisplayName("健康检查 - 无需签名") + void testHealth_NoSignatureRequired() throws Exception { + // 执行 & 验证 - 不需要签名Header + mockMvc.perform(get("/api/public/health")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data").value("Service is healthy")); + } + + @Test + @DisplayName("公开接口 - 即使提供签名也不验证") + void testPublicEndpoint_WithSignature() throws Exception { + // 执行 & 验证 - 即使提供签名Header,公开接口也不验证 + mockMvc.perform(get("/api/public/timestamp") + .header("X-API-APPID", "web-app") + .header("X-API-TIMESTAMP", "1640995200000") + .header("X-API-NONCE", "abc123def456") + .header("X-API-SIGN", "any_signature")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)); + } +} \ No newline at end of file diff --git a/src/test/java/com/deepchart/controller/UserControllerTest.java b/src/test/java/com/deepchart/controller/UserControllerTest.java new file mode 100644 index 0000000..6f9ae44 --- /dev/null +++ b/src/test/java/com/deepchart/controller/UserControllerTest.java @@ -0,0 +1,203 @@ +package com.deepchart.controller; + + +import com.deepchart.common.util.SignUtil; +import com.deepchart.entity.User; +import com.deepchart.service.UserService; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(UserController.class) +@DisplayName("用户控制器测试") +class UserControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @MockBean + private UserService userService; + + private static final String APP_ID = "web-app"; + private static final String APP_SECRET = "web_app_secret_2024"; + private Map signParams; + + @BeforeEach + void setUp() { + signParams = new HashMap<>(); + signParams.put("appId", APP_ID); + signParams.put("timestamp", String.valueOf(System.currentTimeMillis())); + signParams.put("nonce", SignUtil.generateNonce()); + } + + @Test + @DisplayName("创建用户 - 成功") + void testCreateUser_Success() throws Exception { + // 准备 + User user = createTestUser(); + User savedUser = createTestUser(); + savedUser.setId(1L); + + when(userService.createUser(any(User.class))).thenReturn(savedUser); + + // 生成签名 + String sign = generateSign(); + + // 执行 & 验证 + mockMvc.perform(post("/api/users") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", sign) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.message").value("用户创建成功")) + .andExpect(jsonPath("$.data.id").value(1)); + } + + @Test + @DisplayName("创建用户 - 签名验证失败") + void testCreateUser_SignatureFailed() throws Exception { + // 准备 + User user = createTestUser(); + + // 执行 & 验证 - 使用错误的签名 + mockMvc.perform(post("/api/users") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", "wrong_signature") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) // 注意:我们的异常处理返回200状态,但code是401 + .andExpect(jsonPath("$.code").value(1003)) // SIGNATURE_ERROR + .andExpect(jsonPath("$.message").value("签名验证失败")); + } + + @Test + @DisplayName("创建用户 - 缺少签名参数") + void testCreateUser_MissingSignatureParams() throws Exception { + // 准备 + User user = createTestUser(); + + // 执行 & 验证 - 不提供签名Header + mockMvc.perform(post("/api/users") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1003)) // SIGNATURE_ERROR + .andExpect(jsonPath("$.message").value("签名参数缺失")); + } + + @Test + @DisplayName("获取用户列表 - 成功") + void testListUsers_Success() throws Exception { + // 准备 + Page userPage = new PageImpl<>(Collections.singletonList(createTestUser())); + when(userService.listUsers(any(PageRequest.class))).thenReturn(userPage); + + // 生成签名 + String sign = generateSign(); + + // 执行 & 验证 + mockMvc.perform(get("/api/users") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", sign) + .param("page", "0") + .param("size", "10")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.content").isArray()); + } + + @Test + @DisplayName("获取用户详情 - 成功") + void testGetUserById_Success() throws Exception { + // 准备 + User user = createTestUser(); + user.setId(1L); + when(userService.getUserById(1L)).thenReturn(user); + + // 生成签名 + String sign = generateSign(); + + // 执行 & 验证 + mockMvc.perform(get("/api/users/1") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", sign)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.id").value(1)); + } + + @Test + @DisplayName("用户登录 - 成功") + void testLogin_Success() throws Exception { + // 准备 + User user = createTestUser(); + user.setId(1L); + when(userService.login("testuser", "password123")).thenReturn(user); + + // 生成签名 - 包含登录参数 + Map loginParams = new HashMap<>(signParams); + loginParams.put("username", "testuser"); + loginParams.put("password", "password123"); + String sign = SignUtil.generateSign(loginParams, APP_SECRET); + + // 执行 & 验证 + mockMvc.perform(post("/api/users/login") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", sign) + .param("username", "testuser") + .param("password", "password123")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.message").value("登录成功")) + .andExpect(jsonPath("$.data.id").value(1)); + } + + // 辅助方法:创建测试用户 + private User createTestUser() { + User user = new User(); + user.setUsername("testuser"); + user.setPassword("password123"); + user.setEmail("test@example.com"); + user.setNickname("Test User"); + user.setPhone("13800138000"); + return user; + } + + // 辅助方法:生成签名 + private String generateSign() { + return SignUtil.generateSign(signParams, APP_SECRET); + } +} diff --git a/src/test/java/com/deepchart/integration/ApiSignIntegrationTest.java b/src/test/java/com/deepchart/integration/ApiSignIntegrationTest.java new file mode 100644 index 0000000..669d378 --- /dev/null +++ b/src/test/java/com/deepchart/integration/ApiSignIntegrationTest.java @@ -0,0 +1,222 @@ +package com.deepchart.integration; + +import com.deepchart.common.util.SignUtil; +import com.deepchart.entity.User; +import com.deepchart.repository.UserRepository; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.Map; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@SpringBootTest +@AutoConfigureMockMvc +@ActiveProfiles("test") +@Transactional +@DisplayName("API签名集成测试") +class ApiSignIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private UserRepository userRepository; + + private static final String APP_ID = "web-app"; + private static final String APP_SECRET = "web_app_secret_2024"; + private Map signParams; + + @BeforeEach + void setUp() { + signParams = new HashMap<>(); + signParams.put("appId", APP_ID); + signParams.put("timestamp", String.valueOf(System.currentTimeMillis())); + signParams.put("nonce", SignUtil.generateNonce()); + } + + @Test + @DisplayName("完整流程 - 创建用户并查询") + void testCompleteFlow_CreateAndGetUser() throws Exception { + // 准备用户数据 + User user = new User(); + user.setUsername("integration_test_user"); + user.setPassword("password123"); + user.setEmail("integration@test.com"); + user.setNickname("Integration Test User"); + + // 生成创建用户的签名 + String createSign = generateSign(); + + // 1. 创建用户 + String responseJson = mockMvc.perform(post("/api/users") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", createSign) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.id").exists()) + .andReturn().getResponse().getContentAsString(); + + // 提取用户ID + var response = objectMapper.readTree(responseJson); + Long userId = response.path("data").path("id").asLong(); + + // 更新签名参数用于查询 + signParams.put("timestamp", String.valueOf(System.currentTimeMillis())); + signParams.put("nonce", SignUtil.generateNonce()); + String getSign = generateSign(); + + // 2. 查询用户 + mockMvc.perform(get("/api/users/{id}", userId) + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", getSign)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.id").value(userId)) + .andExpect(jsonPath("$.data.username").value("integration_test_user")); + } + + @Test + @DisplayName("重放攻击防护 - 相同的nonce不能重复使用") + void testReplayAttackProtection() throws Exception { + // 准备 + User user = new User(); + user.setUsername("replay_test_user"); + user.setPassword("password123"); + user.setEmail("replay@test.com"); + + // 第一次请求 - 应该成功 + String firstSign = generateSign(); + + mockMvc.perform(post("/api/users") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", firstSign) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)); + + // 第二次使用相同的nonce - 应该失败(时间戳可能过期或nonce重复) + // 注意:实际的重放攻击防护需要在服务端缓存已使用的nonce + // 这里主要测试时间戳过期的情况 + + // 使用过期的时间戳 + long expiredTimestamp = System.currentTimeMillis() - 6 * 60 * 1000; + signParams.put("timestamp", String.valueOf(expiredTimestamp)); + String expiredSign = generateSign(); + + mockMvc.perform(post("/api/users") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", expiredSign) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1003)); // 签名验证失败 + } + + @Test + @DisplayName("时间戳验证 - 过期时间戳被拒绝") + void testTimestampValidation_ExpiredTimestamp() throws Exception { + // 准备过期时间戳 + long expiredTimestamp = System.currentTimeMillis() - 6 * 60 * 1000; + signParams.put("timestamp", String.valueOf(expiredTimestamp)); + + String expiredSign = generateSign(); + + User user = new User(); + user.setUsername("expired_timestamp_user"); + user.setPassword("password123"); + + // 执行 & 验证 + mockMvc.perform(post("/api/users") + .header("X-API-APPID", APP_ID) + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", expiredSign) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1003)) // SIGNATURE_ERROR + .andExpect(jsonPath("$.message").value("签名验证失败")); + } + + @Test + @DisplayName("不同应用ID - 使用不同的密钥") + void testDifferentAppIds_DifferentSecrets() throws Exception { + // 测试使用不同的appId和对应的密钥 + + // 使用mobile-app + Map mobileParams = new HashMap<>(); + mobileParams.put("appId", "mobile-app"); + mobileParams.put("timestamp", String.valueOf(System.currentTimeMillis())); + mobileParams.put("nonce", SignUtil.generateNonce()); + + String mobileSign = SignUtil.generateSign(mobileParams, "mobile_app_secret_2024"); + + User user = new User(); + user.setUsername("mobile_test_user"); + user.setPassword("password123"); + + mockMvc.perform(post("/api/users") + .header("X-API-APPID", "mobile-app") + .header("X-API-TIMESTAMP", mobileParams.get("timestamp")) + .header("X-API-NONCE", mobileParams.get("nonce")) + .header("X-API-SIGN", mobileSign) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)); + } + + @Test + @DisplayName("参数篡改检测 - 修改参数导致签名不匹配") + void testParameterTamperingDetection() throws Exception { + // 准备正确的签名 + String correctSign = generateSign(); + + User user = new User(); + user.setUsername("tamper_test_user"); + user.setPassword("password123"); + + // 尝试篡改参数 - 使用错误的appId但正确的签名 + mockMvc.perform(post("/api/users") + .header("X-API-APPID", "wrong-app") // 篡改的appId + .header("X-API-TIMESTAMP", signParams.get("timestamp")) + .header("X-API-NONCE", signParams.get("nonce")) + .header("X-API-SIGN", correctSign) // 使用原始签名 + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(user))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1003)) // 签名验证失败 + .andExpect(jsonPath("$.message").value("签名验证失败")); + } + + // 辅助方法:生成签名 + private String generateSign() { + return SignUtil.generateSign(signParams, APP_SECRET); + } +} \ No newline at end of file