diff --git a/full_log.txt b/full_log.txt deleted file mode 100644 index 7b29092..0000000 --- a/full_log.txt +++ /dev/null @@ -1,3154 +0,0 @@ -Initialized native services in: /Users/jypc/.gradle/native -Initialized jansi services in: /Users/jypc/.gradle/native -Found daemon DaemonInfo{pid=32397, address=[aa46da5d-a88b-425d-9296-f1e1dc18e288 port:56733, addresses:[/127.0.0.1]], state=Idle, lastBusy=1764003679716, context=DefaultDaemonContext[uid=55fe95a8-b90a-445a-a148-588021245676,javaHome=/Users/jypc/Library/Java/JavaVirtualMachines/corretto-21.0.5/Contents/Home,javaVersion=21,javaVendor=Amazon.com Inc.,daemonRegistryDir=/Users/jypc/.gradle/daemon,pid=32397,idleTimeout=10800000,priority=NORMAL,applyInstrumentationAgent=true,nativeServicesMode=ENABLED,daemonOpts=-XX:MaxMetaspaceSize=384m,-XX:+HeapDumpOnOutOfMemoryError,-Xms256m,-Xmx512m,-Dfile.encoding=UTF-8,-Duser.country=KR,-Duser.language=ko,-Duser.variant]} however its context does not match the desired criteria. -JVM is incompatible. -Wanted: DaemonRequestContext{jvmCriteria=/Users/jypc/Library/Java/JavaVirtualMachines/corretto-22.0.2/Contents/Home (no JDK specified, using current Java home), daemonOpts=[-XX:MaxMetaspaceSize=384m, -XX:+HeapDumpOnOutOfMemoryError, -Xms256m, -Xmx512m, -Dfile.encoding=UTF-8, -Duser.country=KR, -Duser.language=ko, -Duser.variant], applyInstrumentationAgent=true, nativeServicesMode=ENABLED, priority=NORMAL} -Actual: DefaultDaemonContext[uid=55fe95a8-b90a-445a-a148-588021245676,javaHome=/Users/jypc/Library/Java/JavaVirtualMachines/corretto-21.0.5/Contents/Home,javaVersion=21,javaVendor=Amazon.com Inc.,daemonRegistryDir=/Users/jypc/.gradle/daemon,pid=32397,idleTimeout=10800000,priority=NORMAL,applyInstrumentationAgent=true,nativeServicesMode=ENABLED,daemonOpts=-XX:MaxMetaspaceSize=384m,-XX:+HeapDumpOnOutOfMemoryError,-Xms256m,-Xmx512m,-Dfile.encoding=UTF-8,-Duser.country=KR,-Duser.language=ko,-Duser.variant] - - Looking for a different daemon... -The client will now receive all logging from the daemon (pid: 36783). The daemon log file: /Users/jypc/.gradle/daemon/8.14.3/daemon-36783.out.log -Starting 20th build in daemon [uptime: 19 mins 32.843 secs, performance: 100%, GC rate: 0.00/s, heap usage: 1% of 512 MiB, non-heap usage: 21% of 384 MiB] -Using 11 worker leases. -Now considering [/Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end] as hierarchies to watch -Watching the file system is configured to be enabled if available -Invalidating hierarchy because watch probe hasn't been triggered /Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end -Not watching anything anymore -File system watching is active -Starting Build -Settings evaluated using settings file '/Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end/settings.gradle'. -Projects loaded. Root project using build file '/Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end/build.gradle'. -Included projects: [root project 'back-end'] - -> Configure project : -Evaluating root project 'back-end' using build file '/Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end/build.gradle'. -Resolved plugin [id: 'java'] -Resolved plugin [id: 'org.springframework.boot', version: '3.5.6'] -Resolved plugin [id: 'io.spring.dependency-management', version: '1.1.7'] -Applying dependency management to configuration 'annotationProcessor' in project 'back-end' -Applying dependency management to configuration 'apiElements' in project 'back-end' -Applying dependency management to configuration 'archives' in project 'back-end' -Applying dependency management to configuration 'bootArchives' in project 'back-end' -Applying dependency management to configuration 'compileClasspath' in project 'back-end' -Applying dependency management to configuration 'compileOnly' in project 'back-end' -Applying dependency management to configuration 'default' in project 'back-end' -Applying dependency management to configuration 'developmentOnly' in project 'back-end' -Applying dependency management to configuration 'implementation' in project 'back-end' -Applying dependency management to configuration 'mainSourceElements' in project 'back-end' -Applying dependency management to configuration 'productionRuntimeClasspath' in project 'back-end' -Applying dependency management to configuration 'runtimeClasspath' in project 'back-end' -Applying dependency management to configuration 'runtimeElements' in project 'back-end' -Applying dependency management to configuration 'runtimeOnly' in project 'back-end' -Applying dependency management to configuration 'testAndDevelopmentOnly' in project 'back-end' -Applying dependency management to configuration 'testAnnotationProcessor' in project 'back-end' -Applying dependency management to configuration 'testCompileClasspath' in project 'back-end' -Applying dependency management to configuration 'testCompileOnly' in project 'back-end' -Applying dependency management to configuration 'testImplementation' in project 'back-end' -Applying dependency management to configuration 'testResultsElementsForTest' in project 'back-end' -Applying dependency management to configuration 'testRuntimeClasspath' in project 'back-end' -Applying dependency management to configuration 'testRuntimeOnly' in project 'back-end' -All projects evaluated. -Task name matched 'test' -Selected primary task 'test' from project : -Starting process 'command '/usr/libexec/java_home''. Working directory: /Users/jypc/.gradle/daemon/8.14.3 Command: /usr/libexec/java_home -V -Successfully started process 'command '/usr/libexec/java_home'' -Resolving global dependency management for project 'back-end' -Excluding [] -Excluding [] -Excluding [] -Excluding [] -Excluding [] -Excluding [] -Tasks to be executed: [task ':compileJava', task ':processResources', task ':classes', task ':compileTestJava', task ':processTestResources', task ':testClasses', task ':test'] -Tasks that were excluded: [] -Resolve mutations for :compileJava (Thread[#3141,Execution worker,5,main]) started. -:compileJava (Thread[#3141,Execution worker,5,main]) started. - -> Task :compileJava UP-TO-DATE -Custom actions are attached to task ':compileJava'. -Caching disabled for task ':compileJava' because: - Build cache is disabled -Skipping task ':compileJava' as it is up-to-date. -Resolve mutations for :processResources (Thread[#3141,Execution worker,5,main]) started. -:processResources (Thread[#3141,Execution worker,5,main]) started. - -> Task :processResources UP-TO-DATE -Caching disabled for task ':processResources' because: - Build cache is disabled - Not worth caching -Skipping task ':processResources' as it is up-to-date. -Resolve mutations for :classes (Thread[#3141,Execution worker,5,main]) started. -:classes (Thread[#3141,Execution worker,5,main]) started. - -> Task :classes UP-TO-DATE -Skipping task ':classes' as it has no actions. -Resolve mutations for :compileTestJava (Thread[#3146,Execution worker Thread 6,5,main]) started. -:compileTestJava (Thread[#3146,Execution worker Thread 6,5,main]) started. - -> Task :compileTestJava UP-TO-DATE -Custom actions are attached to task ':compileTestJava'. -Caching disabled for task ':compileTestJava' because: - Build cache is disabled -Skipping task ':compileTestJava' as it is up-to-date. -Resolve mutations for :processTestResources (Thread[#3146,Execution worker Thread 6,5,main]) started. -:processTestResources (Thread[#3146,Execution worker Thread 6,5,main]) started. - -> Task :processTestResources NO-SOURCE -Skipping task ':processTestResources' as it has no source files and no previous output files. -Resolve mutations for :testClasses (Thread[#3146,Execution worker Thread 6,5,main]) started. -:testClasses (Thread[#3146,Execution worker Thread 6,5,main]) started. - -> Task :testClasses UP-TO-DATE -Skipping task ':testClasses' as it has no actions. -Resolve mutations for :test (Thread[#3146,Execution worker Thread 6,5,main]) started. -:test (Thread[#3146,Execution worker Thread 6,5,main]) started. -Gradle Test Executor 19 started executing tests. - -> Task :test -Caching disabled for task ':test' because: - Build cache is disabled -Task ':test' is not up-to-date because: - Task has failed previously. -Starting process 'Gradle Test Executor 19'. Working directory: /Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end Command: /Users/jypc/Library/Java/JavaVirtualMachines/corretto-21.0.5/Contents/Home/bin/java -Dorg.gradle.internal.worker.tmpdir=/Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end/build/tmp/test/work @/Users/jypc/.gradle/.tmp/gradle-worker-classpath6671030300930670189txt -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=KR -Duser.language=ko -Duser.variant -ea worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 19' -Successfully started process 'Gradle Test Executor 19' - -ApplicationTests STANDARD_OUT - 02:01:40.944 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [DiffLens.back_end.ApplicationTests]: ApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration. - 02:01:40.999 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration DiffLens.back_end.Application for test class DiffLens.back_end.ApplicationTests - - . ____ _ __ _ _ - /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ - ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ - \\/ ___)| |_)| | | | | || (_| | ) ) ) ) - ' |____| .__|_| |_|_| |_\__, | / / / / - =========|_|==============|___/=/_/_/_/ - - :: Spring Boot :: (v3.5.6) - - 2025-11-25T02:01:41.180+09:00 INFO 41081 --- [ Test worker] DiffLens.back_end.ApplicationTests : Starting ApplicationTests using Java 21.0.5 with PID 41081 (started by jypc in /Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end) - 2025-11-25T02:01:41.181+09:00 INFO 41081 --- [ Test worker] DiffLens.back_end.ApplicationTests : The following 1 profile is active: "local" - 2025-11-25T02:01:41.751+09:00 INFO 41081 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode - 2025-11-25T02:01:41.752+09:00 INFO 41081 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. - 2025-11-25T02:01:41.836+09:00 INFO 41081 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 80 ms. Found 12 JPA repository interfaces. - 2025-11-25T02:01:41.842+09:00 INFO 41081 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode - 2025-11-25T02:01:41.842+09:00 INFO 41081 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. - 2025-11-25T02:01:41.855+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.library.repository.LibraryPanelRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.library.repository.LibraryRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.library.repository.SearchHistoryLibraryRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.members.repository.MemberRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.members.repository.OnboardingRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.members.repository.PlanRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.panel.repository.PanelRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.rawData.repository.RawDataRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.search.repository.ChartRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.857+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.search.repository.FilterRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.858+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.search.repository.SearchFilterRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.858+09:00 INFO 41081 --- [ Test worker] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface DiffLens.back_end.domain.search.repository.SearchHistoryRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository - 2025-11-25T02:01:41.858+09:00 INFO 41081 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces. - 2025-11-25T02:01:42.171+09:00 INFO 41081 --- [ Test worker] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] - 2025-11-25T02:01:42.193+09:00 INFO 41081 --- [ Test worker] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.6.29.Final - 2025-11-25T02:01:42.207+09:00 INFO 41081 --- [ Test worker] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled - 2025-11-25T02:01:42.313+09:00 INFO 41081 --- [ Test worker] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer - 2025-11-25T02:01:42.324+09:00 INFO 41081 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... - 2025-11-25T02:01:42.326+09:00 WARN 41081 --- [ Test worker] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata - - java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at com.zaxxer.hikari.util.DriverDataSource.(DriverDataSource.java:116) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:333) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.PoolBase.(PoolBase.java:118) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:90) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) ~[HikariCP-6.3.3.jar:na] - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:126) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:485) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:334) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:129) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:81) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.model.relational.Database.(Database.java:45) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:226) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:194) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1873) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1822) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) ~[spring-context-6.2.11.jar:6.2.11] - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.11.jar:6.2.11] - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-6.2.11.jar:6.2.11] - at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-6.2.11.jar:6.2.11] - at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:159) ~[spring-test-6.2.11.jar:6.2.11] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:383) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:388) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:382) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] - at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na] - at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[na:na] - at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] - at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:382) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:293) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:292) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:281) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at java.base/java.util.Optional.orElseGet(Optional.java:364) ~[na:na] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:280) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:27) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:112) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:111) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) ~[na:na] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) ~[na:na] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) ~[na:na] - at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) ~[na:na] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na] - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na] - at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) ~[na:na] - at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) ~[na:na] - at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) ~[na:na] - at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) ~[na:na] - at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122) ~[na:na] - at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72) ~[na:na] - at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) ~[gradle-worker.jar:na] - at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) ~[gradle-worker.jar:na] - - 2025-11-25T02:01:42.336+09:00 WARN 41081 --- [ Test worker] org.hibernate.orm.deprecation : HHH90000025: PostgreSQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) - 2025-11-25T02:01:42.341+09:00 INFO 41081 --- [ Test worker] org.hibernate.orm.connections.pooling : HHH10001005: Database info: - Database JDBC URL [Connecting through datasource 'HikariDataSource (null)'] - Database driver: undefined/unknown - Database version: 12.0 - Autocommit mode: undefined/unknown - Isolation level: undefined/unknown - Minimum pool size: undefined/unknown - Maximum pool size: undefined/unknown - 2025-11-25T02:01:42.825+09:00 INFO 41081 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) - 2025-11-25T02:01:42.833+09:00 INFO 41081 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... - 2025-11-25T02:01:42.834+09:00 ERROR 41081 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - 2025-11-25T02:01:42.834+09:00 WARN 41081 --- [ Test worker] 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]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - -ApplicationTests STANDARD_ERROR - - - - ============================ - 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) - - CacheMeterBinderProvidersConfiguration.RedisCacheMeterBinderProviderConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.redis.cache.RedisCache' (OnClassCondition) - - org.springframework.boot.autoconfigure.http.client.reactive.ClientHttpConnectorAutoConfiguration matched: - - @ConditionalOnClass found required classes 'org.springframework.http.client.reactive.ClientHttpConnector', 'reactor.core.publisher.Mono' (OnClassCondition) - - Detected ClientHttpConnectorBuilder (ConditionalOnClientHttpConnectorBuilderDetection) - - org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) - - ClientHttpConnectorAutoConfiguration#clientHttpConnector matched: - - @ConditionalOnMissingBean (types: org.springframework.http.client.reactive.ClientHttpConnector; SearchStrategy: all) did not find any beans (OnBeanCondition) - - ClientHttpConnectorAutoConfiguration#clientHttpConnectorBuilder matched: - - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.reactive.ClientHttpConnectorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) - - ClientHttpConnectorAutoConfiguration#clientHttpConnectorSettings matched: - - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.reactive.ClientHttpConnectorSettings; SearchStrategy: all) did not find any beans (OnBeanCondition) - - org.springframework.boot.autoconfigure.http.client.reactive.ClientHttpConnectorAutoConfiguration$ReactorNetty matched: - - @ConditionalOnClass found required class 'reactor.netty.http.client.HttpClient' (OnClassCondition) - - org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration$ReactorNetty matched: - - @ConditionalOnClass found required class 'reactor.netty.http.client.HttpClient' (OnClassCondition) - - CodecsAutoConfiguration matched: - - @ConditionalOnClass found required classes 'org.springframework.http.codec.CodecConfigurer', 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) - - CodecsAutoConfiguration.JacksonCodecConfiguration matched: - - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) - - CodecsAutoConfiguration.JacksonCodecConfiguration#jacksonCodecCustomizer matched: - - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found bean 'jacksonObjectMapper' (OnBeanCondition) - - 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) - - 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 'prometheusMeterRegistry', '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 not a reactive web application (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 'prometheusMeterRegistry' (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 not a reactive web application (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) - - JpaRepositoriesAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.jpa.repository.JpaRepository' (OnClassCondition) - - @ConditionalOnBooleanProperty (spring.data.jpa.repositories.enabled=true) matched (OnPropertyCondition) - - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found bean 'dataSource'; @ConditionalOnMissingBean (types: org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean,org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension; 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 'prometheusMeterRegistry' (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) - - LettuceConnectionConfiguration matched: - - @ConditionalOnClass found required class 'io.lettuce.core.RedisClient' (OnClassCondition) - - @ConditionalOnProperty (spring.data.redis.client-type=lettuce) matched (OnPropertyCondition) - - LettuceConnectionConfiguration#lettuceClientResources matched: - - @ConditionalOnMissingBean (types: io.lettuce.core.resource.ClientResources; SearchStrategy: all) did not find any beans (OnBeanCondition) - - LettuceConnectionConfiguration#redisConnectionFactory matched: - - @ConditionalOnMissingBean (types: org.springframework.data.redis.connection.RedisConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition) - - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) - - LettuceMetricsAutoConfiguration matched: - - @ConditionalOnClass found required classes 'io.lettuce.core.RedisClient', 'io.lettuce.core.metrics.MicrometerCommandLatencyRecorder' (OnClassCondition) - - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'prometheusMeterRegistry' (OnBeanCondition) - - LettuceMetricsAutoConfiguration#micrometerOptions matched: - - @ConditionalOnMissingBean (types: io.lettuce.core.metrics.MicrometerOptions; 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 'prometheusMeterRegistry' (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) - - 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) - - NettyAutoConfiguration matched: - - @ConditionalOnClass found required class 'io.netty.util.NettyRuntime' (OnClassCondition) - - NoOpCacheConfiguration matched: - - Cache org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration automatic cache type (CacheCondition) - - OAuth2ClientAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.security.oauth2.client.registration.ClientRegistration' (OnClassCondition) - - NoneNestedConditions 0 matched 1 did not; NestedCondition on OAuth2ClientAutoConfiguration.NonReactiveWebApplicationCondition.ReactiveWebApplicationCondition not a reactive web application (OAuth2ClientAutoConfiguration.NonReactiveWebApplicationCondition) - - 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 'prometheusMeterRegistry'; @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) - - PrometheusMetricsExportAutoConfiguration matched: - - @ConditionalOnClass found required class 'io.micrometer.prometheusmetrics.PrometheusMeterRegistry' (OnClassCondition) - - @ConditionalOnEnabledMetricsExport management.prometheus.metrics.export.enabled is true (OnMetricsExportEnabledCondition) - - @ConditionalOnBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) found bean 'micrometerClock' (OnBeanCondition) - - PrometheusMetricsExportAutoConfiguration#prometheusConfig matched: - - @ConditionalOnMissingBean (types: io.micrometer.prometheusmetrics.PrometheusConfig; SearchStrategy: all) did not find any beans (OnBeanCondition) - - PrometheusMetricsExportAutoConfiguration#prometheusMeterRegistry matched: - - @ConditionalOnMissingBean (types: io.micrometer.prometheusmetrics.PrometheusMeterRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) - - PrometheusMetricsExportAutoConfiguration#prometheusRegistry matched: - - @ConditionalOnMissingBean (types: io.prometheus.metrics.model.registry.PrometheusRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) - - PrometheusMetricsExportAutoConfiguration.PrometheusScrapeEndpointConfiguration matched: - - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) - - PrometheusMetricsExportAutoConfiguration.PrometheusScrapeEndpointConfiguration#prometheusEndpoint matched: - - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.export.prometheus.PrometheusScrapeEndpoint; 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) - - ReactiveHealthEndpointConfiguration matched: - - @ConditionalOnClass found required class 'reactor.core.publisher.Flux' (OnClassCondition) - - @ConditionalOnBean (types: org.springframework.boot.actuate.health.HealthEndpoint; SearchStrategy: all) found bean 'healthEndpoint' (OnBeanCondition) - - ReactiveHealthEndpointConfiguration#reactiveHealthContributorRegistry matched: - - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.ReactiveHealthContributorRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) - - ReactiveSecurityAutoConfiguration matched: - - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.web.server.WebFilterChainProxy', 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) - - ReactorAutoConfiguration matched: - - @ConditionalOnClass found required class 'reactor.core.publisher.Hooks' (OnClassCondition) - - ReactorNettyConfigurations.ReactorResourceFactoryConfiguration#reactorResourceFactory matched: - - @ConditionalOnMissingBean (types: org.springframework.http.client.ReactorResourceFactory; SearchStrategy: all) did not find any beans (OnBeanCondition) - - RedisAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.redis.core.RedisOperations' (OnClassCondition) - - RedisAutoConfiguration#redisConnectionDetails matched: - - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; SearchStrategy: all) did not find any beans (OnBeanCondition) - - RedisCacheConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.redis.connection.RedisConnectionFactory' (OnClassCondition) - - Cache org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration automatic cache type (CacheCondition) - - RedisHealthContributorAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.redis.connection.RedisConnectionFactory' (OnClassCondition) - - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) - - @ConditionalOnBean (types: org.springframework.data.redis.connection.RedisConnectionFactory; SearchStrategy: all) found bean 'redisConnectionFactory' (OnBeanCondition) - - RedisReactiveAutoConfiguration matched: - - @ConditionalOnClass found required classes 'org.springframework.data.redis.connection.ReactiveRedisConnectionFactory', 'org.springframework.data.redis.core.ReactiveRedisTemplate', 'reactor.core.publisher.Flux' (OnClassCondition) - - RedisReactiveAutoConfiguration#reactiveRedisTemplate matched: - - @ConditionalOnBean (types: org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; SearchStrategy: all) found bean 'redisConnectionFactory'; @ConditionalOnMissingBean (names: reactiveRedisTemplate; SearchStrategy: all) did not find any beans (OnBeanCondition) - - RedisReactiveAutoConfiguration#reactiveStringRedisTemplate matched: - - @ConditionalOnBean (types: org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; SearchStrategy: all) found bean 'redisConnectionFactory'; @ConditionalOnMissingBean (names: reactiveStringRedisTemplate; SearchStrategy: all) did not find any beans (OnBeanCondition) - - RedisReactiveHealthContributorAutoConfiguration matched: - - @ConditionalOnClass found required classes 'org.springframework.data.redis.connection.ReactiveRedisConnectionFactory', 'reactor.core.publisher.Flux' (OnClassCondition) - - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) - - @ConditionalOnBean (types: org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; SearchStrategy: all) found bean 'redisConnectionFactory' (OnBeanCondition) - - RedisReactiveHealthContributorAutoConfiguration#redisHealthContributor matched: - - @ConditionalOnMissingBean (names: redisHealthIndicator,redisHealthContributor; SearchStrategy: all) did not find any beans (OnBeanCondition) - - RedisRepositoriesAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.redis.repository.configuration.EnableRedisRepositories' (OnClassCondition) - - @ConditionalOnBooleanProperty (spring.data.redis.repositories.enabled=true) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springframework.data.redis.connection.RedisConnectionFactory; SearchStrategy: all) found bean 'redisConnectionFactory'; @ConditionalOnMissingBean (types: org.springframework.data.redis.repository.support.RedisRepositoryFactoryBean; SearchStrategy: all) 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 'prometheusMeterRegistry' (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 not a reactive web application (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 not a reactive web application (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) - - SecurityAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.security.authentication.DefaultAuthenticationEventPublisher' (OnClassCondition) - - SecurityAutoConfiguration#authenticationEventPublisher matched: - - @ConditionalOnMissingBean (types: org.springframework.security.authentication.AuthenticationEventPublisher; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SecurityFilterAutoConfiguration matched: - - @ConditionalOnClass found required classes 'org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer', 'org.springframework.security.config.http.SessionCreationPolicy' (OnClassCondition) - - found 'session' scope (OnWebApplicationCondition) - - SecurityFilterAutoConfiguration#securityFilterChainRegistration matched: - - @ConditionalOnBean (names: springSecurityFilterChain; SearchStrategy: all) found bean 'springSecurityFilterChain' (OnBeanCondition) - - SecurityRequestMatchersManagementContextConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.security.web.util.matcher.RequestMatcher' (OnClassCondition) - - found 'session' scope (OnWebApplicationCondition) - - SecurityRequestMatchersManagementContextConfiguration.MvcRequestMatcherConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) - - @ConditionalOnBean (types: org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath; SearchStrategy: all) found bean 'dispatcherServletRegistration' (OnBeanCondition) - - SecurityRequestMatchersManagementContextConfiguration.MvcRequestMatcherConfiguration#requestMatcherProvider matched: - - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) - - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.autoconfigure.security.servlet.RequestMatcherProvider; SearchStrategy: all) did not find any beans (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) - - SpringBootWebSecurityConfiguration matched: - - found 'session' scope (OnWebApplicationCondition) - - 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) - - SpringDocConfigProperties matched: - - @ConditionalOnProperty (springdoc.api-docs.enabled) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SpringDocConfiguration matched: - - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnProperty (springdoc.api-docs.enabled) matched (OnPropertyCondition) - - SpringDocConfiguration#fileSupportConverter matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.FileSupportConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#globalOpenApiCustomizer matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.customizers.GlobalOpenApiCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#openAPIBuilder matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.service.OpenAPIService; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#operationBuilder matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.service.OperationService; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#parameterBuilder matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.service.GenericParameterService; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#parameterObjectNamingStrategyCustomizer matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.customizers.ParameterObjectNamingStrategyCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#polymorphicModelConverter matched: - - @ConditionalOnProperty (springdoc.model-converters.polymorphic-converter.enabled) matched (OnPropertyCondition) - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.PolymorphicModelConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#requestBodyBuilder matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.service.RequestBodyService; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#responseSupportConverter matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.ResponseSupportConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#schemaPropertyDeprecatingConverter matched: - - @ConditionalOnProperty (springdoc.model-converters.deprecating-converter.enabled) matched (OnPropertyCondition) - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.SchemaPropertyDeprecatingConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#securityParser matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.service.SecurityService; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#springDocCustomizers matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.customizers.SpringDocCustomizers; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#springDocProviders matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.providers.SpringDocProviders; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration#springdocObjectMapperProvider matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.providers.ObjectMapperProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration.QuerydslProvider matched: - - @ConditionalOnClass found required class 'org.springframework.data.querydsl.binding.QuerydslBindingsFactory' (OnClassCondition) - - SpringDocConfiguration.QuerydslProvider#queryDslQuerydslPredicateOperationCustomizer matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.customizers.QuerydslPredicateOperationCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration.SpringDocSpringDataWebPropertiesProvider matched: - - @ConditionalOnClass found required class 'org.springframework.boot.autoconfigure.data.web.SpringDataWebProperties' (OnClassCondition) - - SpringDocConfiguration.SpringDocSpringDataWebPropertiesProvider#springDataWebPropertiesProvider matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.providers.SpringDataWebPropertiesProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration.SpringDocWebFluxSupportConfiguration matched: - - @ConditionalOnClass found required class 'reactor.core.publisher.Flux' (OnClassCondition) - - SpringDocConfiguration.SpringDocWebFluxSupportConfiguration#webFluxSupportConverter matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.WebFluxSupportConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocConfiguration.WebConversionServiceConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.boot.autoconfigure.web.format.WebConversionService' (OnClassCondition) - - SpringDocPageableConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.domain.Pageable' (OnClassCondition) - - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnProperty (springdoc.api-docs.enabled) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SpringDocPageableConfiguration#dataRestDelegatingMethodParameterCustomizer matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.customizers.DataRestDelegatingMethodParameterCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocPageableConfiguration#pageOpenAPIConverter matched: - - @ConditionalOnClass found required classes 'org.springframework.data.web.PagedModel', 'org.springframework.data.web.config.SpringDataWebSettings' (OnClassCondition) - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.PageOpenAPIConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocPageableConfiguration#pageableOpenAPIConverter matched: - - @ConditionalOnProperty (springdoc.model-converters.pageable-converter.enabled) matched (OnPropertyCondition) - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.PageableOpenAPIConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocSecurityConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.security.web.SecurityFilterChain' (OnClassCondition) - - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnExpression (#{${springdoc.api-docs.enabled:true} and ${springdoc.enable-spring-security:true}}) resulted in true (OnExpressionCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SpringDocSecurityConfiguration.SpringDocSecurityOAuth2ClientConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient' (OnClassCondition) - - SpringDocSecurityConfiguration.SpringSecurityLoginEndpointConfiguration matched: - - @ConditionalOnClass found required class 'jakarta.servlet.Filter' (OnClassCondition) - - SpringDocSortConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.data.domain.Sort' (OnClassCondition) - - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnProperty (springdoc.api-docs.enabled) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SpringDocSortConfiguration#sortOpenAPIConverter matched: - - @ConditionalOnProperty (springdoc.sort-converter.enabled) matched (OnPropertyCondition) - - @ConditionalOnMissingBean (types: org.springdoc.core.converters.SortOpenAPIConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocUIConfiguration matched: - - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SpringDocWebMvcConfiguration matched: - - found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnProperty (springdoc.api-docs.enabled) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SpringDocWebMvcConfiguration#openApiResource matched: - - @ConditionalOnExpression (#{(${springdoc.use-management-port:false} == false ) and ${springdoc.enable-default-api-docs:true}}) resulted in true (OnExpressionCondition) - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.api.OpenApiWebMvcResource; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocWebMvcConfiguration#requestBuilder matched: - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.core.service.RequestService; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocWebMvcConfiguration#responseBuilder matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.service.GenericResponseService; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocWebMvcConfiguration#springWebProvider matched: - - @ConditionalOnMissingBean (types: org.springdoc.core.providers.SpringWebProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SpringDocWebMvcConfiguration.SpringDocWebMvcActuatorConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping' (OnClassCondition) - - SpringDocWebMvcConfiguration.SpringDocWebMvcRouterConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.web.servlet.function.RouterFunction' (OnClassCondition) - - SpringDocWebMvcConfiguration.SpringDocWebMvcRouterConfiguration#routerFunctionProvider matched: - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.core.providers.RouterFunctionWebMvcProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) - - 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 'prometheusMeterRegistry', 'sslBundleRegistry' (OnBeanCondition) - - StartupTimeMetricsListenerAutoConfiguration matched: - - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) - - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'prometheusMeterRegistry' (OnBeanCondition) - - StartupTimeMetricsListenerAutoConfiguration#startupTimeMetrics matched: - - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.startup.StartupTimeMetricsListener; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SwaggerConfig matched: - - found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnProperty (springdoc.swagger-ui.enabled) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SwaggerConfig#indexPageTransformer matched: - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.ui.SwaggerIndexTransformer; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SwaggerConfig#swaggerConfigResource matched: - - @ConditionalOnProperty (springdoc.use-management-port=false) matched (OnPropertyCondition) - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.ui.SwaggerConfigResource; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SwaggerConfig#swaggerResourceResolver matched: - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.ui.SwaggerResourceResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SwaggerConfig#swaggerWebMvcConfigurer matched: - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.ui.SwaggerWebMvcConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SwaggerConfig#swaggerWelcome matched: - - @ConditionalOnProperty (springdoc.use-management-port=false) matched (OnPropertyCondition) - - @ConditionalOnMissingBean (types: org.springdoc.webmvc.ui.SwaggerWelcomeWebMvc; SearchStrategy: all) did not find any beans (OnBeanCondition) - - SwaggerUiConfigProperties matched: - - @ConditionalOnProperty (springdoc.swagger-ui.enabled) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SwaggerUiOAuthProperties matched: - - @ConditionalOnProperty (springdoc.swagger-ui.enabled) matched (OnPropertyCondition) - - @ConditionalOnBean (types: org.springdoc.core.configuration.SpringDocConfiguration; SearchStrategy: all) found bean 'org.springdoc.core.configuration.SpringDocConfiguration' (OnBeanCondition) - - SystemMetricsAutoConfiguration matched: - - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) - - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'prometheusMeterRegistry' (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 'prometheusMeterRegistry', 'applicationTaskExecutor' (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 'prometheusMeterRegistry'; @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.EnableTransactionManagementConfiguration matched: - - @ConditionalOnBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found bean 'transactionManager'; @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) - - TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration matched: - - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition) - - 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) - - WebClientAutoConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) - - WebClientAutoConfiguration#webClientBuilder matched: - - @ConditionalOnMissingBean (types: org.springframework.web.reactive.function.client.WebClient$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) - - WebClientAutoConfiguration#webClientHttpConnectorCustomizer matched: - - @ConditionalOnBean (types: org.springframework.http.client.reactive.ClientHttpConnector; SearchStrategy: all) found bean 'clientHttpConnector' (OnBeanCondition) - - WebClientAutoConfiguration#webClientSsl matched: - - @ConditionalOnBean (types: org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found bean 'sslBundleRegistry'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientSsl; SearchStrategy: all) did not find any beans (OnBeanCondition) - - WebClientAutoConfiguration.WebClientCodecsConfiguration matched: - - @ConditionalOnBean (types: org.springframework.boot.web.codec.CodecCustomizer; SearchStrategy: all) found beans 'jacksonCodecCustomizer', 'defaultCodecCustomizer' (OnBeanCondition) - - WebClientAutoConfiguration.WebClientCodecsConfiguration#exchangeStrategiesCustomizer matched: - - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientCodecCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) - - WebClientObservationConfiguration matched: - - @ConditionalOnClass found required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) - - 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.ResourceChainCustomizerConfiguration matched: - - @ConditionalOnEnabledResourceChain found class org.webjars.WebJarVersionLocator (OnEnabledResourceChainCondition) - - 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 'prometheusMeterRegistry' (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 class '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 class 'javax.cache.CacheManager' (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) - - 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) - - 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 'prometheusMeterRegistry'; NestedCondition on CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition.NoMeterRegistryCondition @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' prometheusMeterRegistry (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 'org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchClient' (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: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found 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: - - not a reactive web application (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: - - not a reactive web application (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: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'org.springframework.web.reactive.DispatcherHandler', 'org.springframework.http.server.reactive.HttpHandler' (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) - - JedisConnectionConfiguration: - Did not match: - - @ConditionalOnClass did not find required classes 'org.apache.commons.pool2.impl.GenericObjectPool', 'redis.clients.jedis.Jedis' (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#entityManagerFactoryBootstrapExecutorCustomizer: - Did not match: - - AnyNestedCondition 0 matched 2 did not; NestedCondition on JpaRepositoriesAutoConfiguration.BootstrapExecutorCondition.LazyBootstrapMode @ConditionalOnProperty (spring.data.jpa.repositories.bootstrap-mode=lazy) did not find property 'spring.data.jpa.repositories.bootstrap-mode'; NestedCondition on JpaRepositoriesAutoConfiguration.BootstrapExecutorCondition.DeferredBootstrapMode @ConditionalOnProperty (spring.data.jpa.repositories.bootstrap-mode=deferred) did not find property 'spring.data.jpa.repositories.bootstrap-mode' (JpaRepositoriesAutoConfiguration.BootstrapExecutorCondition) - - 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) - - LettuceConnectionConfiguration#redisConnectionFactoryVirtualThreads: - Did not match: - - @ConditionalOnMissingBean (types: org.springframework.data.redis.connection.RedisConnectionFactory; SearchStrategy: all) found beans of type 'org.springframework.data.redis.connection.RedisConnectionFactory' redisConnectionFactory (OnBeanCondition) - - 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: - - @ConditionalOnBean (types: org.springframework.mail.javamail.JavaMailSenderImpl; SearchStrategy: all) did not find any beans of type org.springframework.mail.javamail.JavaMailSenderImpl (OnBeanCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.mail.javamail.JavaMailSenderImpl' (OnClassCondition) - - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) - - MailSenderAutoConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'jakarta.mail.internet.MimeMessage' (OnClassCondition) - - MailSenderValidatorAutoConfiguration: - Did not match: - - @ConditionalOnBooleanProperty (spring.mail.test-connection=true) did not find property 'spring.mail.test-connection' (OnPropertyCondition) - - 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: org.springframework.security.web.SecurityFilterChain; SearchStrategy: all) found beans of type 'org.springframework.security.web.SecurityFilterChain' securityFilterChain; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass found 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) - - MetricsEndpointAutoConfiguration: - Did not match: - - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) - Matched: - - @ConditionalOnClass found required class 'io.micrometer.core.annotation.Timed' (OnClassCondition) - - MicrometerTracingAutoConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (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 'org.springframework.data.mongodb.core.ReactiveMongoTemplate' (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) - - MultipleOpenApiSupportConfiguration: - Did not match: - - AnyNestedCondition 0 matched 2 did not; NestedCondition on MultipleOpenApiSupportCondition.OnActuatorDifferentPort found non-matching nested conditions Management Port actual port type (SAME) did not match required type (DIFFERENT), @ConditionalOnProperty (springdoc.show-actuator) did not find property 'springdoc.show-actuator'; NestedCondition on MultipleOpenApiSupportCondition.OnMultipleOpenApiSupportCondition AnyNestedCondition 0 matched 3 did not; NestedCondition on MultipleOpenApiGroupsCondition.OnListGroupedOpenApiBean @ConditionalOnBean (types: org.springdoc.core.models.GroupedOpenApi; SearchStrategy: all) did not find any beans of type org.springdoc.core.models.GroupedOpenApi; NestedCondition on MultipleOpenApiGroupsCondition.OnGroupConfigProperty @ConditionalOnProperty (springdoc.group-configs[0].group) did not find property 'springdoc.group-configs[0].group'; NestedCondition on MultipleOpenApiGroupsCondition.OnGroupedOpenApiBean @ConditionalOnBean (types: org.springdoc.core.models.GroupedOpenApi; SearchStrategy: all) did not find any beans of type org.springdoc.core.models.GroupedOpenApi (MultipleOpenApiSupportCondition) - Matched: - - found 'session' scope (OnWebApplicationCondition) - - @ConditionalOnProperty (springdoc.api-docs.enabled) matched (OnPropertyCondition) - - MultipleOpenApiSupportConfiguration.SpringDocWebMvcActuatorDifferentConfiguration: - Did not match: - - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) - - Ancestor org.springdoc.webmvc.core.configuration.MultipleOpenApiSupportConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping' (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) - - 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' prometheusMeterRegistry (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 'org.springframework.security.oauth2.server.authorization.OAuth2Authorization' (OnClassCondition) - - OAuth2ClientConfigurations.ClientRegistrationRepositoryConfiguration: - Did not match: - - OAuth2 Clients Configured Condition registered clients is not available (ClientsConfiguredCondition) - - OAuth2ClientConfigurations.OAuth2AuthorizedClientServiceConfiguration: - Did not match: - - @ConditionalOnBean (types: org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; SearchStrategy: all) did not find any beans of type org.springframework.security.oauth2.client.registration.ClientRegistrationRepository (OnBeanCondition) - - OAuth2ClientWebSecurityAutoConfiguration: - Did not match: - - @ConditionalOnBean (types: org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; SearchStrategy: all) did not find any beans of type org.springframework.security.oauth2.client.OAuth2AuthorizedClientService (OnBeanCondition) - Matched: - - @ConditionalOnClass found required classes 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity', 'org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository' (OnClassCondition) - - found 'session' scope (OnWebApplicationCondition) - - 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.PrometheusPushGatewayConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'io.prometheus.metrics.exporter.pushgateway.PushGateway' (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) - - 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.rsocket.RSocket' (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: - - not a reactive web application (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 'org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchClient' (OnClassCondition) - - ReactiveManagementContextAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required class 'reactor.core.publisher.Flux' (OnClassCondition) - - ReactiveManagementWebSecurityAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.web.server.WebFilterChainProxy' (OnClassCondition) - - ReactiveMultipartAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'org.springframework.http.codec.multipart.DefaultPartHttpMessageReader', 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) - - ReactiveOAuth2ClientAutoConfiguration: - Did not match: - - NoneNestedConditions 1 matched 0 did not; NestedCondition on ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition.ServletApplicationCondition found 'session' scope (ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.oauth2.client.registration.ClientRegistration' (OnClassCondition) - - ReactiveOAuth2ClientWebSecurityAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository' (OnClassCondition) - - ReactiveOAuth2ResourceServerAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity' (OnClassCondition) - - ReactiveSecurityAutoConfiguration.SpringBootWebFluxSecurityConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - - ReactiveUserDetailsServiceAutoConfiguration: - Did not match: - - AnyNestedCondition 0 matched 3 did not; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) did not find property 'spring.security.user.password'; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) did not find property 'spring.security.user.name'; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass found unwanted class 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository' (ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured) - Matched: - - @ConditionalOnClass found required class 'org.springframework.security.authentication.ReactiveAuthenticationManager' (OnClassCondition) - - ReactiveWebServerFactoryAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.http.ReactiveHttpInputMessage' (OnClassCondition) - - RedisAutoConfiguration#redisTemplate: - Did not match: - - @ConditionalOnMissingBean (names: redisTemplate; SearchStrategy: all) found beans named redisTemplate (OnBeanCondition) - - RedisAutoConfiguration#stringRedisTemplate: - Did not match: - - @ConditionalOnMissingBean (types: org.springframework.data.redis.core.StringRedisTemplate; SearchStrategy: all) found beans of type 'org.springframework.data.redis.core.StringRedisTemplate' stringRedisTemplate (OnBeanCondition) - - RedisHealthContributorAutoConfiguration#redisHealthContributor: - Did not match: - - @ConditionalOnMissingBean (names: redisHealthIndicator,redisHealthContributor; SearchStrategy: all) found beans named redisHealthContributor (OnBeanCondition) - - 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) - - SecurityDataConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'org.springframework.security.data.repository.query.SecurityEvaluationContextExtension' (OnClassCondition) - - SecurityRequestMatchersManagementContextConfiguration.JerseyRequestMatcherConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (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) - - SimpleMetricsExportAutoConfiguration: - Did not match: - - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' prometheusMeterRegistry (OnBeanCondition) - Matched: - - @ConditionalOnEnabledMetricsExport management.simple.metrics.export.enabled is true (OnMetricsExportEnabledCondition) - - SpringApplicationAdminJmxAutoConfiguration: - Did not match: - - @ConditionalOnBooleanProperty (spring.application.admin.enabled=true) did not find property 'spring.application.admin.enabled' (OnPropertyCondition) - - SpringBootWebSecurityConfiguration.SecurityFilterChainConfiguration: - Did not match: - - AllNestedConditions 1 matched 1 did not; NestedCondition on DefaultWebSecurityCondition.Beans @ConditionalOnMissingBean (types: org.springframework.security.web.SecurityFilterChain; SearchStrategy: all) found beans of type 'org.springframework.security.web.SecurityFilterChain' securityFilterChain; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass found required classes 'org.springframework.security.web.SecurityFilterChain', 'org.springframework.security.config.annotation.web.builders.HttpSecurity' (DefaultWebSecurityCondition) - - SpringBootWebSecurityConfiguration.WebSecurityEnablerConfiguration: - Did not match: - - @ConditionalOnMissingBean (names: springSecurityFilterChain; SearchStrategy: all) found beans named springSecurityFilterChain (OnBeanCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition) - - SpringDocConfiguration#propertiesResolverForSchema: - Did not match: - - @ConditionalOnProperty (springdoc.api-docs.resolve-schema-properties) did not find property 'springdoc.api-docs.resolve-schema-properties' (OnPropertyCondition) - - SpringDocConfiguration#propertyCustomizingConverter: - Did not match: - - @ConditionalOnBean (types: org.springdoc.core.customizers.PropertyCustomizer; SearchStrategy: all) did not find any beans of type org.springdoc.core.customizers.PropertyCustomizer (OnBeanCondition) - - SpringDocConfiguration#springdocBeanFactoryPostProcessor: - Did not match: - - AnyNestedCondition 0 matched 2 did not; NestedCondition on CacheOrGroupedOpenApiCondition.OnCacheDisabled found non-matching nested conditions @ConditionalOnProperty (springdoc.cache.disabled) did not find property 'springdoc.cache.disabled'; NestedCondition on CacheOrGroupedOpenApiCondition.OnMultipleOpenApiSupportCondition AnyNestedCondition 0 matched 2 did not; NestedCondition on MultipleOpenApiSupportCondition.OnActuatorDifferentPort found non-matching nested conditions Management Port actual port type (SAME) did not match required type (DIFFERENT), @ConditionalOnProperty (springdoc.show-actuator) did not find property 'springdoc.show-actuator'; NestedCondition on MultipleOpenApiSupportCondition.OnMultipleOpenApiSupportCondition AnyNestedCondition 0 matched 3 did not; NestedCondition on MultipleOpenApiGroupsCondition.OnListGroupedOpenApiBean @ConditionalOnBean (types: org.springdoc.core.models.GroupedOpenApi; SearchStrategy: all) did not find any beans of type org.springdoc.core.models.GroupedOpenApi; NestedCondition on MultipleOpenApiGroupsCondition.OnGroupConfigProperty @ConditionalOnProperty (springdoc.group-configs[0].group) did not find property 'springdoc.group-configs[0].group'; NestedCondition on MultipleOpenApiGroupsCondition.OnGroupedOpenApiBean @ConditionalOnBean (types: org.springdoc.core.models.GroupedOpenApi; SearchStrategy: all) did not find any beans of type org.springdoc.core.models.GroupedOpenApi (CacheOrGroupedOpenApiCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.boot.context.properties.bind.BindResult' (OnClassCondition) - - SpringDocConfiguration#springdocBeanFactoryPostProcessor2: - Did not match: - - @ConditionalOnMissingClass found unwanted class 'org.springframework.boot.context.properties.bind.BindResult' (OnClassCondition) - - SpringDocConfiguration.SpringDocActuatorConfiguration: - Did not match: - - @ConditionalOnProperty (springdoc.show-actuator) did not find property 'springdoc.show-actuator' (OnPropertyCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' (OnClassCondition) - - SpringDocConfiguration.SpringDocRepositoryRestConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'org.springframework.data.rest.core.config.RepositoryRestConfiguration' (OnClassCondition) - - SpringDocDataRestConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'org.springframework.data.rest.core.config.RepositoryRestConfiguration' (OnClassCondition) - - SpringDocFunctionCatalogConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'org.springframework.cloud.function.web.function.FunctionEndpointInitializer' (OnClassCondition) - - SpringDocGroovyConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'groovy.lang.MetaClass' (OnClassCondition) - - SpringDocHateoasConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'org.springframework.hateoas.server.LinkRelationProvider' (OnClassCondition) - - SpringDocJacksonKotlinModuleConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'com.fasterxml.jackson.module.kotlin.KotlinModule' (OnClassCondition) - - SpringDocJavadocConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'com.github.therapi.runtimejavadoc.CommentFormatter' (OnClassCondition) - - SpringDocKotlinConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'kotlin.coroutines.Continuation' (OnClassCondition) - - SpringDocKotlinxConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'kotlinx.coroutines.flow.Flow' (OnClassCondition) - - SpringDocSecurityConfiguration.SpringDocSecurityOAuth2Configuration: - Did not match: - - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService' (OnClassCondition) - - SpringDocSecurityConfiguration.SpringSecurityLoginEndpointConfiguration#springSecurityLoginEndpointCustomizer: - Did not match: - - @ConditionalOnProperty (springdoc.show-login-endpoint) did not find property 'springdoc.show-login-endpoint' (OnPropertyCondition) - - SpringDocSortConfiguration#dataRestDelegatingMethodParameterCustomizer: - Did not match: - - @ConditionalOnMissingBean (types: org.springdoc.core.customizers.DataRestDelegatingMethodParameterCustomizer; SearchStrategy: all) found beans of type 'org.springdoc.core.customizers.DataRestDelegatingMethodParameterCustomizer' dataRestDelegatingMethodParameterCustomizer (OnBeanCondition) - - SpringDocWebMvcConfiguration.SpringDocWebMvcActuatorConfiguration#actuatorProvider: - Did not match: - - @ConditionalOnExpression (#{${springdoc.show-actuator:false} or ${springdoc.use-management-port:false}}) resulted in false (OnExpressionCondition) - - SpringDocWebMvcConfiguration.SpringDocWebMvcActuatorConfiguration#openApiActuatorResource: - Did not match: - - @ConditionalOnExpression (#{${springdoc.use-management-port:false} and ${springdoc.enable-default-api-docs:true}}) resulted in false (OnExpressionCondition) - - SqlInitializationAutoConfiguration: - Did not match: - - NoneNestedConditions 1 matched 0 did not; NestedCondition on SqlInitializationAutoConfiguration.SqlInitializationModeCondition.ModeIsNever @ConditionalOnProperty (spring.sql.init.mode=never) matched (SqlInitializationAutoConfiguration.SqlInitializationModeCondition) - Matched: - - @ConditionalOnBooleanProperty (spring.sql.init.enabled=true) matched (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) - - SwaggerConfig#springWebProvider: - Did not match: - - @ConditionalOnMissingBean (types: org.springdoc.core.providers.SpringWebProvider; SearchStrategy: all) found beans of type 'org.springdoc.core.providers.SpringWebProvider' springWebProvider (OnBeanCondition) - - SwaggerConfig#swaggerUiHome: - Did not match: - - @ConditionalOnProperty (springdoc.swagger-ui.use-root-path=true) did not find property 'springdoc.swagger-ui.use-root-path' (OnPropertyCondition) - - SwaggerConfig.SwaggerActuatorWelcomeConfiguration: - Did not match: - - @ConditionalOnProperty (springdoc.use-management-port) did not find property 'springdoc.use-management-port' (OnPropertyCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping' (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.JdkDynamicAutoProxyConfiguration: - Did not match: - - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=false) did not find property 'spring.aop.proxy-target-class' (OnPropertyCondition) - - UserDetailsServiceAutoConfiguration: - Did not match: - - AnyNestedCondition 0 matched 3 did not; NestedCondition on UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) did not find property 'spring.security.user.password'; NestedCondition on UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) did not find property 'spring.security.user.name'; NestedCondition on UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass found unwanted class 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository' (UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured) - Matched: - - @ConditionalOnClass found required class 'org.springframework.security.authentication.AuthenticationManager' (OnClassCondition) - - found 'session' scope (OnWebApplicationCondition) - - 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) - - WebFluxAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) - - WebFluxEndpointManagementContextConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'org.springframework.web.reactive.DispatcherHandler', 'org.springframework.http.server.reactive.HttpHandler' (OnClassCondition) - - WebFluxObservationAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'io.micrometer.observation.Observation', 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) - - 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.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.ws.client.core.WebServiceTemplate' (OnClassCondition) - - WebServicesAutoConfiguration: - Did not match: - - @ConditionalOnClass did not find required class 'org.springframework.ws.transport.http.MessageDispatcherServlet' (OnClassCondition) - - WebSessionIdResolverAutoConfiguration: - Did not match: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'org.springframework.web.server.session.WebSessionManager', '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: - - not a reactive web application (OnWebApplicationCondition) - Matched: - - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'jakarta.websocket.server.ServerContainer' (OnClassCondition) - - 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) - - 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.springdoc.core.configuration.SpringDocSpecPropertiesConfiguration - - org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration - - org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration - - - - -ApplicationTests STANDARD_OUT - 2025-11-25T02:01:42.858+09:00 INFO 41081 --- [ Test worker] .s.b.a.l.ConditionEvaluationReportLogger : - - Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. - 2025-11-25T02:01:42.866+09:00 ERROR 41081 --- [ Test worker] o.s.boot.SpringApplication : Application run failed - - org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1826) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) ~[spring-context-6.2.11.jar:6.2.11] - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.11.jar:6.2.11] - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-6.2.11.jar:6.2.11] - at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-6.2.11.jar:6.2.11] - at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:159) ~[spring-test-6.2.11.jar:6.2.11] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:383) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:388) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:382) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] - at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na] - at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[na:na] - at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] - at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:382) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:293) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:292) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:281) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at java.base/java.util.Optional.orElseGet(Optional.java:364) ~[na:na] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:280) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:27) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:112) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:111) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) ~[na:na] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) ~[na:na] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) ~[na:na] - at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) ~[na:na] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na] - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na] - at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) ~[na:na] - at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) ~[na:na] - at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) ~[na:na] - at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) ~[na:na] - at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122) ~[na:na] - at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72) ~[na:na] - at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) ~[gradle-worker.jar:na] - at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) ~[gradle-worker.jar:na] - Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:431) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1873) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1822) ~[spring-beans-6.2.11.jar:6.2.11] - ... 111 common frames omitted - Caused by: java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at com.zaxxer.hikari.util.DriverDataSource.(DriverDataSource.java:116) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:333) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.PoolBase.(PoolBase.java:118) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:90) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) ~[HikariCP-6.3.3.jar:na] - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:126) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:485) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:39) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:63) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:43) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:66) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:60) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:185) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:93) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:280) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at java.base/java.util.HashMap.forEach(HashMap.java:1429) ~[na:na] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:324) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:463) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1517) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) ~[spring-orm-6.2.11.jar:6.2.11] - ... 115 common frames omitted - - 2025-11-25T02:01:42.869+09:00 WARN 41081 --- [ Test worker] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] to prepare test instance [DiffLens.back_end.ApplicationTests@5b52ce28] - - java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@808fa1 testClass = DiffLens.back_end.ApplicationTests, locations = [], classes = [DiffLens.back_end.Application], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@1a45193b, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@25bc0606, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@33aeca0b, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@1ae67cad, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5b1f29fa, org.springframework.boot.test.web.reactive.server.WebTestClientContextCustomizer@31aa3ca5, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@549949be, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@48be1cb1], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] - at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:159) ~[spring-test-6.2.11.jar:6.2.11] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:383) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:388) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:382) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[na:na] - at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] - at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na] - at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[na:na] - at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[na:na] - at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] - at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:382) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:293) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:292) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:281) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at java.base/java.util.Optional.orElseGet(Optional.java:364) ~[na:na] - at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:280) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:27) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:112) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:111) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.12.2.jar:5.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) ~[na:na] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) ~[na:na] - at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) ~[na:na] - at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) ~[na:na] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na] - at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na] - at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) ~[na:na] - at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) ~[na:na] - at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) ~[na:na] - at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) ~[na:na] - at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) ~[na:na] - at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122) ~[na:na] - at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72) ~[na:na] - at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) ~[gradle-worker.jar:na] - at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) ~[gradle-worker.jar:na] - 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]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1826) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) ~[spring-context-6.2.11.jar:6.2.11] - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.11.jar:6.2.11] - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-6.2.11.jar:6.2.11] - at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-6.2.11.jar:6.2.11] - at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) ~[spring-boot-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) ~[spring-boot-test-3.5.6.jar:3.5.6] - at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) ~[spring-test-6.2.11.jar:6.2.11] - at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ~[spring-test-6.2.11.jar:6.2.11] - ... 91 common frames omitted - Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:431) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1873) ~[spring-beans-6.2.11.jar:6.2.11] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1822) ~[spring-beans-6.2.11.jar:6.2.11] - ... 111 common frames omitted - Caused by: java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at com.zaxxer.hikari.util.DriverDataSource.(DriverDataSource.java:116) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:333) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.PoolBase.(PoolBase.java:118) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:90) ~[HikariCP-6.3.3.jar:na] - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) ~[HikariCP-6.3.3.jar:na] - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:126) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:485) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:39) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:63) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:43) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:66) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:60) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:185) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:93) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:280) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at java.base/java.util.HashMap.forEach(HashMap.java:1429) ~[na:na] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:324) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:463) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1517) ~[hibernate-core-6.6.29.Final.jar:6.6.29.Final] - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.2.11.jar:6.2.11] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) ~[spring-orm-6.2.11.jar:6.2.11] - ... 115 common frames omitted - - -Gradle Test Executor 19 finished executing tests. - -> Task :test FAILED - -ApplicationTests > contextLoads() FAILED - java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@808fa1 testClass = DiffLens.back_end.ApplicationTests, locations = [], classes = [DiffLens.back_end.Application], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@1a45193b, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@25bc0606, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@33aeca0b, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@1ae67cad, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5b1f29fa, org.springframework.boot.test.web.reactive.server.WebTestClientContextCustomizer@31aa3ca5, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@549949be, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@48be1cb1], 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 java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) - 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:1708) - 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:151) - at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) - at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) - at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) - at java.base/java.util.Optional.orElseGet(Optional.java:364) - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) - at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) - - 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]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1826) - at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607) - at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) - at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) - at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) - at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) - at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) - at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) - at app//org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) - at app//org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) - at app//org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) - at app//org.springframework.boot.SpringApplication.run(SpringApplication.java:318) - at app//org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) - at app//org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) - at app//org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) - at app//org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) - at app//org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) - at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) - at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) - at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) - at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) - ... 19 more - - Caused by: - jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:431) - at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) - at app//org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1873) - at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1822) - ... 39 more - - Caused by: - java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${PSQL_URL} - at com.zaxxer.hikari.util.DriverDataSource.(DriverDataSource.java:116) - at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:333) - at com.zaxxer.hikari.pool.PoolBase.(PoolBase.java:118) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:90) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:126) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:485) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:39) - at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:63) - at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:43) - at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) - at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:66) - at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:60) - at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:185) - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:93) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:280) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) - at java.base/java.util.HashMap.forEach(HashMap.java:1429) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:324) - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:463) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1517) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) - ... 43 more - -1 test completed, 1 failed -Finished generating test XML results (0.002 secs) into: /Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end/build/test-results/test -Generating HTML test report... -Finished generating test html results (0.004 secs) into: /Users/jypc/Desktop/학교/3학년/2학기/기업연계SW/project/back-end/build/reports/tests/test - -FAILURE: Build failed with an exception. - -* What went wrong: -Execution failed for task ':test'. -> There were failing tests. See the report at: file:///Users/jypc/Desktop/%ED%95%99%EA%B5%90/3%ED%95%99%EB%85%84/2%ED%95%99%EA%B8%B0/%EA%B8%B0%EC%97%85%EC%97%B0%EA%B3%84SW/project/back-end/build/reports/tests/test/index.html - -* Try: -> Run with --scan to get full insights. - -BUILD FAILED in 2s -4 actionable tasks: 1 executed, 3 up-to-date -Watched directory hierarchies: [] diff --git a/src/main/java/DiffLens/back_end/domain/library/controller/LibraryController.java b/src/main/java/DiffLens/back_end/domain/library/controller/LibraryController.java index a451e71..a242a2a 100644 --- a/src/main/java/DiffLens/back_end/domain/library/controller/LibraryController.java +++ b/src/main/java/DiffLens/back_end/domain/library/controller/LibraryController.java @@ -1,10 +1,13 @@ package DiffLens.back_end.domain.library.controller; +import DiffLens.back_end.domain.library.dto.LibraryCreateResult; import DiffLens.back_end.domain.library.dto.LibraryRequestDto; import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; import DiffLens.back_end.domain.library.dto.LibraryCompareRequestDTO; import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO; -import DiffLens.back_end.domain.library.service.LibraryService; +import DiffLens.back_end.domain.library.service.analysis.LibraryAnalysisService; +import DiffLens.back_end.domain.library.service.command.LibraryCommandService; +import DiffLens.back_end.domain.library.service.query.LibraryQueryService; import DiffLens.back_end.domain.members.entity.Member; import DiffLens.back_end.domain.members.service.auth.CurrentUserService; import DiffLens.back_end.global.responses.exception.ApiResponse; @@ -14,15 +17,15 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Tag(name = "라이브러리 API") @RestController @RequestMapping("/libraries") @RequiredArgsConstructor public class LibraryController { - private final LibraryService libraryService; + private final LibraryAnalysisService libraryAnalysisService; + private final LibraryQueryService libraryQueryService; + private final LibraryCommandService libraryCommandService; private final CurrentUserService currentUserService; @GetMapping @@ -49,7 +52,7 @@ public class LibraryController { """) public ApiResponse libraryList() { Member member = currentUserService.getCurrentUser(); - LibraryResponseDTO.ListResult result = libraryService.getLibrariesByMember(member); + LibraryResponseDTO.ListResult result = libraryQueryService.getLibrariesByMember(member); return ApiResponse.onSuccess(result); } @@ -79,12 +82,12 @@ public ApiResponse libraryList() { public ApiResponse createLibrary( @RequestBody @Valid LibraryRequestDto.Create request) { Member member = currentUserService.getCurrentUser(); - LibraryService.LibraryCreateResult createResult = libraryService.createLibrary(request, member); + LibraryCreateResult createResult = libraryCommandService.createLibrary(request, member); LibraryResponseDTO.CreateResult result = LibraryResponseDTO.CreateResult.from( - createResult.getLibrary(), + createResult.library(), request.getSearchHistoryId(), - createResult.getPanelCount()); + createResult.panelCount()); return ApiResponse.onSuccess(result); } @@ -107,7 +110,7 @@ public ApiResponse createLibrary( """) public ApiResponse getLibraryDetail(@PathVariable Long libraryId) { Member member = currentUserService.getCurrentUser(); - LibraryResponseDTO.LibraryDetail result = libraryService.getLibraryDetail(libraryId, member); + LibraryResponseDTO.LibraryDetail result = libraryQueryService.getLibraryDetail(libraryId, member); return ApiResponse.onSuccess(result); } @@ -143,13 +146,13 @@ public ApiResponse addSearchHistoryToLibrary( @PathVariable Long libraryId, @PathVariable Long searchHistoryId) { Member member = currentUserService.getCurrentUser(); - LibraryService.LibraryCreateResult createResult = libraryService.addSearchHistoryToLibrary(libraryId, - searchHistoryId, member); + LibraryCreateResult createResult = libraryCommandService.addSearchHistoryToLibrary(libraryId, searchHistoryId, member); LibraryResponseDTO.CreateResult result = LibraryResponseDTO.CreateResult.from( - createResult.getLibrary(), + createResult.library(), searchHistoryId, - createResult.getPanelCount()); + createResult.panelCount() + ); return ApiResponse.onSuccess(result); } @@ -179,7 +182,7 @@ public ApiResponse addSearchHistoryToLibrary( public ApiResponse compareLibraries( @RequestBody @Valid LibraryCompareRequestDTO.Compare request) { Member member = currentUserService.getCurrentUser(); - LibraryCompareResponseDTO.CompareResult result = libraryService.compareLibraries(request, member); + LibraryCompareResponseDTO.CompareResult result = libraryAnalysisService.compareLibraries(request, member); return ApiResponse.onSuccess(result); } @@ -208,7 +211,7 @@ public ApiResponse compareLibraries( public ApiResponse getLibraryDashboard( @PathVariable("libraryId") Long libraryId) { Member member = currentUserService.getCurrentUser(); - LibraryResponseDTO.LibraryDashboard result = libraryService.getLibraryDashboard(libraryId, member); + LibraryResponseDTO.LibraryDashboard result = libraryAnalysisService.getLibraryDashboard(libraryId, member); return ApiResponse.onSuccess(result); } @@ -238,8 +241,7 @@ public ApiResponse getLibraryPanels( @RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "size", defaultValue = "20") Integer size) { Member member = currentUserService.getCurrentUser(); - LibraryResponseDTO.LibraryPanels result = libraryService.getLibraryPanels(libraryId, page, size, - member); + LibraryResponseDTO.LibraryPanels result = libraryQueryService.getLibraryPanels(libraryId, page, size, member); return ApiResponse.onSuccess(result); } } diff --git a/src/main/java/DiffLens/back_end/domain/library/converter/dtoConvert/LibraryQueryConverter.java b/src/main/java/DiffLens/back_end/domain/library/converter/dtoConvert/LibraryQueryConverter.java new file mode 100644 index 0000000..574c4b8 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/converter/dtoConvert/LibraryQueryConverter.java @@ -0,0 +1,71 @@ +package DiffLens.back_end.domain.library.converter.dtoConvert; + +import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; +import DiffLens.back_end.domain.library.entity.Library; +import DiffLens.back_end.domain.library.entity.SearchHistoryLibrary; +import DiffLens.back_end.domain.members.entity.Member; +import DiffLens.back_end.domain.panel.entity.Panel; +import DiffLens.back_end.domain.search.entity.SearchHistory; +import DiffLens.back_end.global.dto.ResponsePageDTO; +import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; + +import java.util.List; + +public class LibraryQueryConverter { + + public static List toPanelInfos(List panels) { + return panels.stream() + .map(panel -> LibraryResponseDTO.LibraryDetail.PanelInfo.builder() + .panelId(panel.getId()) + .gender(panel.getGender() != null ? panel.getGender().toString() : null) + .age(panel.getAge()) + .ageGroup(panel.getAgeGroup()) + .residence(panel.getRegion()) + .maritalStatus(panel.getMaritalStatus()) + .childrenCount(panel.getChildrenCount()) + .occupation(panel.getOccupation()) + .profileSummary(panel.getProfileSummary()) + .build()) + .toList(); + } + + public static List toSearchHistoryInfos( + List historyLinks + ) { + return historyLinks.stream() + .map(shl -> { + SearchHistory history = shl.getHistory(); + return LibraryResponseDTO.LibraryDetail.SearchHistoryInfo.builder() + .searchHistoryId(history.getId()) + .content(history.getContent()) + .date(toStringOrNull(history.getDate())) + .panelCount(history.getPanelIds() != null ? history.getPanelIds().size() : 0) + .createdAt(toStringOrNull(history.getCreatedDate())) + .build(); + }) + .toList(); + } + + public static LibraryResponseDTO.LibraryPanels emptyPanelResponse(Integer size) { + return LibraryResponseDTO.LibraryPanels.builder() + .keys(List.of("respondent_id", "gender", "age", "residence", "personal_income")) + .values(List.of()) + .pageInfo(ResponsePageDTO.OffsetLimitPageInfo.builder() + .offset(0) + .currentPage(1) + .currentPageCount(0) + .totalPageCount(0) + .limit(size) + .totalCount(0L) + .hasNext(false) + .hasPrevious(false) + .build()) + .build(); + } + + private static String toStringOrNull(Object obj) { + return obj != null ? obj.toString() : null; + } + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/dto/LibraryCompareRedisKeySuffix.java b/src/main/java/DiffLens/back_end/domain/library/dto/LibraryCompareRedisKeySuffix.java new file mode 100644 index 0000000..b67b492 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/dto/LibraryCompareRedisKeySuffix.java @@ -0,0 +1,18 @@ +package DiffLens.back_end.domain.library.dto; + +import DiffLens.back_end.domain.library.entity.Library; + +public record LibraryCompareRedisKeySuffix( + Long lib1Id, + Long lib2Id +) { + + public static LibraryCompareRedisKeySuffix of(Library lib1, Library lib2) { + return new LibraryCompareRedisKeySuffix(lib1.getId(), lib2.getId()); + } + + public static LibraryCompareRedisKeySuffix of(Long lib1, Long lib2) { + return new LibraryCompareRedisKeySuffix(lib1, lib2); + } + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/dto/LibraryCreateResult.java b/src/main/java/DiffLens/back_end/domain/library/dto/LibraryCreateResult.java new file mode 100644 index 0000000..29f5436 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/dto/LibraryCreateResult.java @@ -0,0 +1,15 @@ +package DiffLens.back_end.domain.library.dto; + +import DiffLens.back_end.domain.library.entity.Library; + +// 라이브러리 생성 결과를 담는 내부 레코드 +public record LibraryCreateResult( + Library library, + int panelCount +) { + + public static LibraryCreateResult of(Library library, int panelCount) { + return new LibraryCreateResult(library, panelCount); + } + +} \ No newline at end of file diff --git a/src/main/java/DiffLens/back_end/domain/library/service/LibraryService.java b/src/main/java/DiffLens/back_end/domain/library/service/LibraryService.java deleted file mode 100644 index cfd3b35..0000000 --- a/src/main/java/DiffLens/back_end/domain/library/service/LibraryService.java +++ /dev/null @@ -1,830 +0,0 @@ -package DiffLens.back_end.domain.library.service; - -import DiffLens.back_end.domain.library.dto.LibraryRequestDto; -import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; -import DiffLens.back_end.domain.library.dto.LibraryCompareRequestDTO; -import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO; -import DiffLens.back_end.domain.library.entity.Library; -import DiffLens.back_end.domain.library.entity.LibraryPanel; -import DiffLens.back_end.domain.library.entity.LibraryPanelKey; -import DiffLens.back_end.domain.library.entity.SearchHistoryLibrary; -import DiffLens.back_end.domain.library.entity.SearchHistoryLibraryKey; -import DiffLens.back_end.domain.library.repository.LibraryPanelRepository; -import DiffLens.back_end.domain.library.repository.LibraryRepository; -import DiffLens.back_end.domain.library.repository.SearchHistoryLibraryRepository; -import DiffLens.back_end.domain.members.entity.Member; -import DiffLens.back_end.domain.panel.entity.Panel; -import DiffLens.back_end.domain.panel.repository.PanelRepository; -import DiffLens.back_end.domain.search.entity.Filter; -import DiffLens.back_end.domain.search.entity.SearchFilter; -import DiffLens.back_end.domain.search.entity.SearchHistory; -import DiffLens.back_end.domain.search.enums.filters.Gender; -import DiffLens.back_end.domain.search.repository.FilterRepository; -import DiffLens.back_end.domain.search.repository.SearchFilterRepository; -import DiffLens.back_end.domain.search.repository.SearchHistoryRepository; -import DiffLens.back_end.domain.panel.repository.projection.PanelWithRawDataDTO; -import DiffLens.back_end.domain.search.service.interfaces.SearchPanelService; -import DiffLens.back_end.global.dto.ResponsePageDTO; -import DiffLens.back_end.global.fastapi.FastApiService; -import DiffLens.back_end.global.fastapi.dto.request.FastLibraryChartRequestDTO; -import DiffLens.back_end.global.fastapi.dto.response.FastChartResponseDTO; -import DiffLens.back_end.global.fastapi.dto.response.FastLibraryChartResponseDTO; -import DiffLens.back_end.global.fastapi.dto.response.FastLibraryCompareResponseDTO; -import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; -import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@Service -@RequiredArgsConstructor -public class LibraryService { - - private final LibraryRepository libraryRepository; - private final LibraryPanelRepository libraryPanelRepository; - private final SearchHistoryLibraryRepository searchHistoryLibraryRepository; - private final SearchHistoryRepository searchHistoryRepository; - private final PanelRepository panelRepository; - private final FastApiService fastApiService; - private final SearchFilterRepository searchFilterRepository; - private final FilterRepository filterRepository; - private final SearchPanelService searchPanelService; - - @Transactional - public LibraryCreateResult createLibrary(LibraryRequestDto.Create request, Member member) { - - // 1. SearchHistory 검증 - SearchHistory history = searchHistoryRepository.findById(request.getSearchHistoryId()) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - // 2. 권한 검증 - 본인의 검색 기록만 라이브러리로 저장 가능 - if (!history.getMember().getId().equals(member.getId())) { - throw new ErrorHandler(ErrorStatus.FORBIDDEN); - } - - // 3. Library 생성 (SearchHistory 참조 제거) - // 패널 ID 결정: 요청에 있으면 사용, 없으면 검색기록의 패널 ID 사용 - List panelIds = request.getPanelIds() != null - ? request.getPanelIds() - : history.getPanelIds(); - - Library library = Library.builder() - .libraryName(request.getLibraryName()) - .tags(request.getTags()) - .panelIds(panelIds != null ? panelIds : List.of()) - .member(member) - .build(); - - library = libraryRepository.save(library); - - // 4. Library-SearchHistory 다대다 관계 생성 - SearchHistoryLibrary searchHistoryLibrary = SearchHistoryLibrary.builder() - .id(new SearchHistoryLibraryKey(history.getId(), library.getId())) - .library(library) - .history(history) - .build(); - - searchHistoryLibraryRepository.save(searchHistoryLibrary); - - // 5. Panel 관계 생성 - int panelCount = 0; - if (panelIds != null && !panelIds.isEmpty()) { - createLibraryPanels(library, panelIds); - panelCount = panelIds.size(); - } - - return new LibraryCreateResult(library, panelCount); - } - - @Transactional - public LibraryCreateResult addSearchHistoryToLibrary(Long libraryId, Long searchHistoryId, Member member) { - // 1. 라이브러리 조회 및 권한 검증 - Library library = libraryRepository.findById(libraryId) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - if (!library.getMember().getId().equals(member.getId())) { - throw new ErrorHandler(ErrorStatus.FORBIDDEN); - } - - // 2. 검색기록 조회 및 권한 검증 - SearchHistory searchHistory = searchHistoryRepository.findById(searchHistoryId) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - if (!searchHistory.getMember().getId().equals(member.getId())) { - throw new ErrorHandler(ErrorStatus.FORBIDDEN); - } - - // 3. 패널 ID 병합 (중복 제거) - List existingPanelIds = library.getPanelIds(); - List newPanelIds = searchHistory.getPanelIds(); - List mergedPanelIds = Stream.concat( - existingPanelIds.stream(), - newPanelIds.stream()).distinct().collect(Collectors.toList()); - - // 4. 새로운 패널들만 LibraryPanel에 추가 - List newPanelsToAdd = newPanelIds.stream() - .filter(panelId -> !existingPanelIds.contains(panelId)) - .collect(Collectors.toList()); - - int addedPanelCount = 0; - if (!newPanelsToAdd.isEmpty()) { - createLibraryPanels(library, newPanelsToAdd); - addedPanelCount = newPanelsToAdd.size(); - } - - // 5. Library 엔티티의 panelIds 업데이트 - // 기존 엔티티의 panelIds만 업데이트 (AuditingEntityListener가 updatedAt 자동 관리) - library.setPanelIds(mergedPanelIds); - library = libraryRepository.save(library); - - // 6. SearchHistoryLibrary 관계 생성 (존재하지 않을 때만) - SearchHistoryLibraryKey searchHistoryLibraryKey = new SearchHistoryLibraryKey(searchHistoryId, - libraryId); - boolean relationshipExists = searchHistoryLibraryRepository.existsById(searchHistoryLibraryKey); - - if (!relationshipExists) { - SearchHistoryLibrary searchHistoryLibrary = SearchHistoryLibrary.builder() - .id(searchHistoryLibraryKey) - .library(library) - .history(searchHistory) - .build(); - searchHistoryLibraryRepository.save(searchHistoryLibrary); - } - - return new LibraryCreateResult(library, addedPanelCount); - } - - @Transactional(readOnly = true) - public LibraryResponseDTO.ListResult getLibrariesByMember(Member member) { - List libraries = libraryRepository.findByMemberOrderByCreatedDateDesc(member); - - List libraryItems = libraries.stream() - .map(library -> { - int panelCount = libraryPanelRepository.countByLibraryId(library.getId()); - return LibraryResponseDTO.ListResult.LibraryItem.from(library, panelCount); - }) - .toList(); - - return LibraryResponseDTO.ListResult.builder() - .libraries(libraryItems) - .cursorPageInfo(null) // 페이징이 필요하면 추후 구현 - .build(); - } - - @Transactional(readOnly = true) - public LibraryResponseDTO.LibraryDetail getLibraryDetail(Long libraryId, Member member) { - // 1. 라이브러리 조회 및 권한 검증 - Library library = libraryRepository.findById(libraryId) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - if (!library.getMember().getId().equals(member.getId())) { - throw new ErrorHandler(ErrorStatus.FORBIDDEN); - } - - // 2. 패널 정보 조회 - List panels = panelRepository.findByIdList(library.getPanelIds()); - List panelInfos = panels.stream() - .map(panel -> LibraryResponseDTO.LibraryDetail.PanelInfo.builder() - .panelId(panel.getId()) - .gender(panel.getGender() != null ? panel.getGender().toString() : null) - .age(panel.getAge()) - .ageGroup(panel.getAgeGroup()) - .residence(panel.getRegion()) - .maritalStatus(panel.getMaritalStatus()) - .childrenCount(panel.getChildrenCount()) - .occupation(panel.getOccupation()) - .profileSummary(panel.getProfileSummary()) - .build()) - .toList(); - - // 3. 연결된 검색기록 조회 - List searchHistoryLibraries = searchHistoryLibraryRepository - .findByLibraryId(libraryId); - List searchHistoryInfos = searchHistoryLibraries - .stream() - .map(shl -> { - SearchHistory history = shl.getHistory(); - return LibraryResponseDTO.LibraryDetail.SearchHistoryInfo.builder() - .searchHistoryId(history.getId()) - .content(history.getContent()) - .date(history.getDate() != null ? history.getDate().toString() - : null) - .panelCount(history.getPanelIds() != null - ? history.getPanelIds().size() - : 0) - .createdAt(history.getCreatedDate() != null - ? history.getCreatedDate().toString() - : null) - .build(); - }) - .toList(); - - // 4. 통계 정보 생성 - LibraryResponseDTO.LibraryDetail.Statistics statistics = createStatistics(panels); - - return LibraryResponseDTO.LibraryDetail.builder() - .libraryId(library.getId()) - .libraryName(library.getLibraryName()) - .tags(library.getTags()) - .panelCount(panels.size()) - .panelIds(library.getPanelIds()) - .panels(panelInfos) - .searchHistories(searchHistoryInfos) - .statistics(statistics) - .createdAt(library.getCreatedDate() != null ? library.getCreatedDate().toString() - : null) - .updatedAt(library.getUpdatedAt() != null ? library.getUpdatedAt().toString() : null) - .build(); - } - - // 추후 혹시 라이브러리 상세 페이지에서 간단한 통계 디자인 생길 것 대비해 작성해둠 - private LibraryResponseDTO.LibraryDetail.Statistics createStatistics(List panels) { - // 성별 분포 - long maleCount = panels.stream() - .filter(p -> p.getGender() != null && p.getGender().toString().equals("MALE")).count(); - long femaleCount = panels.stream() - .filter(p -> p.getGender() != null && p.getGender().toString().equals("FEMALE")) - .count(); - long noneCount = panels.stream() - .filter(p -> p.getGender() != null && p.getGender().toString().equals("NONE")).count(); - - LibraryResponseDTO.LibraryDetail.Statistics.GenderDistribution genderDistribution = LibraryResponseDTO.LibraryDetail.Statistics.GenderDistribution - .builder() - .male((int) maleCount) - .female((int) femaleCount) - .none((int) noneCount) - .build(); - - // 연령대 분포 - long twenties = panels.stream().filter(p -> "20대".equals(p.getAgeGroup())).count(); - long thirties = panels.stream().filter(p -> "30대".equals(p.getAgeGroup())).count(); - long forties = panels.stream().filter(p -> "40대".equals(p.getAgeGroup())).count(); - long fifties = panels.stream().filter(p -> "50대".equals(p.getAgeGroup())).count(); - long sixtiesPlus = panels.stream().filter(p -> p.getAgeGroup() != null && - (p.getAgeGroup().contains("60") || p.getAgeGroup().contains("70") - || p.getAgeGroup().contains("80"))) - .count(); - - LibraryResponseDTO.LibraryDetail.Statistics.AgeGroupDistribution ageGroupDistribution = LibraryResponseDTO.LibraryDetail.Statistics.AgeGroupDistribution - .builder() - .twenties((int) twenties) - .thirties((int) thirties) - .forties((int) forties) - .fifties((int) fifties) - .sixtiesPlus((int) sixtiesPlus) - .build(); - - // 거주지 분포 - long seoul = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("서울")) - .count(); - long gyeonggi = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("경기")) - .count(); - long busan = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("부산")) - .count(); - long other = panels.size() - seoul - gyeonggi - busan; - - LibraryResponseDTO.LibraryDetail.Statistics.ResidenceDistribution residenceDistribution = LibraryResponseDTO.LibraryDetail.Statistics.ResidenceDistribution - .builder() - .seoul((int) seoul) - .gyeonggi((int) gyeonggi) - .busan((int) busan) - .other((int) other) - .build(); - - return LibraryResponseDTO.LibraryDetail.Statistics.builder() - .totalPanels(panels.size()) - .genderDistribution(genderDistribution) - .ageGroupDistribution(ageGroupDistribution) - .residenceDistribution(residenceDistribution) - .build(); - } - - @Transactional(readOnly = true) - public LibraryCompareResponseDTO.CompareResult compareLibraries(LibraryCompareRequestDTO.Compare request, - Member member) { - // 1. 요청 검증 - 같은 라이브러리 비교 불가 - if (request.getLibraryId1().equals(request.getLibraryId2())) { - throw new ErrorHandler(ErrorStatus.BAD_REQUEST); - } - - // 2. 라이브러리 조회 및 권한 확인 - Library library1 = libraryRepository.findById(request.getLibraryId1()) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - Library library2 = libraryRepository.findById(request.getLibraryId2()) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - // 3. 권한 검증 - 본인의 라이브러리만 비교 가능 - if (!library1.getMember().getId().equals(member.getId()) || - !library2.getMember().getId().equals(member.getId())) { - throw new ErrorHandler(ErrorStatus.FORBIDDEN); - } - - // 4. FastAPI 서버로 비교 요청 - FastLibraryCompareResponseDTO.CompareResult fastApiResponse = fastApiService - .compareLibraries(library1.getId(), library2.getId()); - - // 5. 응답 데이터 구성 - return LibraryCompareResponseDTO.CompareResult.builder() - .group1(convertGroupInfo(fastApiResponse.getCohort1(), library1)) - .group2(convertGroupInfo(fastApiResponse.getCohort2(), library2)) - .keyCharacteristics(convertCharacteristics(fastApiResponse.getCharacteristics())) - .comparisons(convertBasicInfoComparisons( - fastApiResponse.getBasicInfo(), - fastApiResponse.getRegionDistribution(), - fastApiResponse.getGenderDistribution())) - .insights(convertKeyInsights(fastApiResponse.getKeyInsights())) - .build(); - } - - /** - * CohortBasicInfo를 GroupInfo로 변환 - */ - private LibraryCompareResponseDTO.GroupInfo convertGroupInfo( - FastLibraryCompareResponseDTO.CohortBasicInfo cohortInfo, - Library library) { - return LibraryCompareResponseDTO.GroupInfo.builder() - .libraryId(Long.parseLong(cohortInfo.getCohortId())) - .libraryName(cohortInfo.getCohortName()) - .totalCount(cohortInfo.getPanelCount()) - .filters(convertFilters(library)) - .build(); - } - - /** - * CharacteristicComparison 리스트를 KeyCharacteristic 리스트로 변환 - */ - private List convertCharacteristics( - List characteristics) { - if (characteristics == null || characteristics.isEmpty()) { - return List.of(); - } - return characteristics.stream() - .map(fast -> LibraryCompareResponseDTO.KeyCharacteristic.builder() - .characteristic(fast.getCharacteristic()) - .description(null) // 새 스키마에는 description이 없음 - .group1Percentage(fast.getCohort1Percentage() != null - ? fast.getCohort1Percentage().intValue() - : 0) - .group2Percentage(fast.getCohort2Percentage() != null - ? fast.getCohort2Percentage().intValue() - : 0) - .difference(fast.getDifferencePercentage() != null - ? fast.getDifferencePercentage().intValue() - : 0) - .build()) - .toList(); - } - - /** - * BasicInfoComparison 리스트를 Comparisons로 변환 - * basic_info에서 메트릭별로 값을 추출하여 GroupMetrics 구성 - * region_distribution 데이터를 group1, group2의 지역 필드에 매핑 - * gender_distribution 데이터를 group1, group2의 성별 필드에 매핑 - */ - private LibraryCompareResponseDTO.Comparisons convertBasicInfoComparisons( - List basicInfo, - FastLibraryCompareResponseDTO.RegionDistribution regionDistribution, - FastLibraryCompareResponseDTO.GenderDistribution genderDistribution) { - if (basicInfo == null || basicInfo.isEmpty()) { - return LibraryCompareResponseDTO.Comparisons.builder() - .group1(LibraryCompareResponseDTO.GroupMetrics.builder().build()) - .group2(LibraryCompareResponseDTO.GroupMetrics.builder().build()) - .build(); - } - - // basic_info에서 메트릭별로 값 추출 - LibraryCompareResponseDTO.GroupMetrics.GroupMetricsBuilder group1Builder = LibraryCompareResponseDTO.GroupMetrics - .builder(); - LibraryCompareResponseDTO.GroupMetrics.GroupMetricsBuilder group2Builder = LibraryCompareResponseDTO.GroupMetrics - .builder(); - - for (FastLibraryCompareResponseDTO.BasicInfoComparison info : basicInfo) { - String metricName = info.getMetricName(); - Double cohort1Value = info.getCohort1Value(); - Double cohort2Value = info.getCohort2Value(); - - switch (metricName) { - case "age": - if (cohort1Value != null) - group1Builder.avgAge(cohort1Value); - if (cohort2Value != null) - group2Builder.avgAge(cohort2Value); - break; - case "family_size": - if (cohort1Value != null) - group1Builder.avgFamily(cohort1Value); - if (cohort2Value != null) - group2Builder.avgFamily(cohort2Value); - break; - case "children_count": - if (cohort1Value != null) - group1Builder.avgChildren(cohort1Value); - if (cohort2Value != null) - group2Builder.avgChildren(cohort2Value); - break; - case "personal_income": - if (cohort1Value != null) - group1Builder.avgPersonalIncome(cohort1Value.intValue()); - if (cohort2Value != null) - group2Builder.avgPersonalIncome(cohort2Value.intValue()); - break; - case "household_income": - if (cohort1Value != null) - group1Builder.avgFamilyIncome(cohort1Value.intValue()); - if (cohort2Value != null) - group2Builder.avgFamilyIncome(cohort2Value.intValue()); - break; - case "car_ownership": - if (cohort1Value != null) - group1Builder.ratePossessingCar(cohort1Value.intValue()); - if (cohort2Value != null) - group2Builder.ratePossessingCar(cohort2Value.intValue()); - break; - } - } - - // region_distribution 데이터를 group1, group2의 지역 필드에 매핑 - if (regionDistribution != null) { - // cohort_1 (group1) 지역 데이터 매핑 - if (regionDistribution.getCohort1() != null) { - java.util.Map cohort1Region = regionDistribution.getCohort1(); - group1Builder.seoul(cohort1Region.getOrDefault("서울", 0.0).intValue()); - group1Builder.gyeonggi(cohort1Region.getOrDefault("경기", 0.0).intValue()); - group1Builder.busan(cohort1Region.getOrDefault("부산", 0.0).intValue()); - group1Builder.regionEtc(cohort1Region.getOrDefault("기타", 0.0).intValue()); - } - - // cohort_2 (group2) 지역 데이터 매핑 - if (regionDistribution.getCohort2() != null) { - java.util.Map cohort2Region = regionDistribution.getCohort2(); - group2Builder.seoul(cohort2Region.getOrDefault("서울", 0.0).intValue()); - group2Builder.gyeonggi(cohort2Region.getOrDefault("경기", 0.0).intValue()); - group2Builder.busan(cohort2Region.getOrDefault("부산", 0.0).intValue()); - group2Builder.regionEtc(cohort2Region.getOrDefault("기타", 0.0).intValue()); - } - } - - // gender_distribution 데이터를 group1, group2의 성별 필드에 매핑 - if (genderDistribution != null) { - // cohort_1 (group1) 성별 데이터 매핑 - if (genderDistribution.getCohort1() != null) { - java.util.Map cohort1Gender = genderDistribution.getCohort1(); - group1Builder.male(cohort1Gender.getOrDefault("남성", 0.0).intValue()); - group1Builder.female(cohort1Gender.getOrDefault("여성", 0.0).intValue()); - } - - // cohort_2 (group2) 성별 데이터 매핑 - if (genderDistribution.getCohort2() != null) { - java.util.Map cohort2Gender = genderDistribution.getCohort2(); - group2Builder.male(cohort2Gender.getOrDefault("남성", 0.0).intValue()); - group2Builder.female(cohort2Gender.getOrDefault("여성", 0.0).intValue()); - } - } - - return LibraryCompareResponseDTO.Comparisons.builder() - .group1(group1Builder.build()) - .group2(group2Builder.build()) - .build(); - } - - /** - * KeyInsights를 Insights로 변환 (nullable 처리) - */ - private LibraryCompareResponseDTO.Insights convertKeyInsights( - FastLibraryCompareResponseDTO.KeyInsights keyInsights) { - if (keyInsights == null) { - return null; - } - return LibraryCompareResponseDTO.Insights.builder() - .difference(keyInsights.getMainDifferences()) - .common(keyInsights.getCommonalities()) - .implication(keyInsights.getImplications()) - .build(); - } - - private LibraryCompareResponseDTO.GroupMetrics getGroupMetrics(Library library) { - List panels = panelRepository.findByIdList(library.getPanelIds()); - int total = panels.size(); - if (total == 0) { - return LibraryCompareResponseDTO.GroupMetrics.builder() - .male(0).female(0) - .seoul(0).gyeonggi(0).busan(0).regionEtc(0) - .ratePossessingCar(0) - .avgAge(0.0) - .avgFamily(0.0) - .avgChildren(0.0) - .avgPersonalIncome(0) - .avgFamilyIncome(0) - .build(); - } - - long maleCount = panels.stream() - .filter(p -> p.getGender() != null && p.getGender().toString().equals(Gender.MALE)) - .count(); - long femaleCount = panels.stream() - .filter(p -> p.getGender() != null && p.getGender().toString().equals(Gender.FEMALE)) - .count(); - - long seoul = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("서울")).count(); - long gyeonggi = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("경기")) - .count(); - long busan = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("부산")).count(); - long regionEtc = total - seoul - gyeonggi - busan; - - long carOwners = panels.stream() - .filter(p -> p.getCarOwnership() != null && p.getCarOwnership().contains("있음")).count(); - - double avgAge = panels.stream() - .filter(p -> p.getAge() != null) - .mapToInt(Panel::getAge) - .average() - .orElse(0); - - double avgFamily = panels.stream() - .filter(p -> p.getFamilySize() != null) - .mapToInt(p -> { - try { - return Integer.parseInt(p.getFamilySize()); - } catch (NumberFormatException e) { - return 0; - } - }).average().orElse(0); - - double avgChildren = panels.stream() - .filter(p -> p.getChildrenCount() != null) - .mapToInt(Panel::getChildrenCount) - .average() - .orElse(0); - - double avgPersonalIncome = panels.stream() - .filter(p -> p.getPersonalIncome() != null) - .mapToInt(p -> parseIncome(p.getPersonalIncome())) - .average() - .orElse(0); - - double avgFamilyIncome = panels.stream() - .filter(p -> p.getHouseholdIncome() != null) - .mapToInt(p -> parseIncome(p.getHouseholdIncome())) - .average() - .orElse(0); - - return LibraryCompareResponseDTO.GroupMetrics.builder() - .male((int) Math.round((double) maleCount / total * 100)) - .female((int) Math.round((double) femaleCount / total * 100)) - .seoul((int) Math.round((double) seoul / total * 100)) - .gyeonggi((int) Math.round((double) gyeonggi / total * 100)) - .busan((int) Math.round((double) busan / total * 100)) - .regionEtc((int) Math.round((double) regionEtc / total * 100)) - .ratePossessingCar((int) Math.round((double) carOwners / total * 100)) - .avgAge(avgAge) - .avgFamily(avgFamily) - .avgChildren(avgChildren) - .avgPersonalIncome((int) avgPersonalIncome) - .avgFamilyIncome((int) avgFamilyIncome) - .build(); - } - - // 문자열 -> 숫자 - private int parseIncome(String incomeStr) { - if (incomeStr == null) - return 0; - String clean = incomeStr.replaceAll("[^0-9]", ""); - if (clean.isEmpty()) - return 0; - try { - return Integer.parseInt(clean); - } catch (NumberFormatException e) { - return 0; - } - } - - private List convertFilters(Library library) { - List searchHistoryLibraries = searchHistoryLibraryRepository - .findByLibraryId(library.getId()); - - List histories = searchHistoryLibraries.stream() - .map(SearchHistoryLibrary::getHistory) - .toList(); - - List searchFilters = searchFilterRepository.findBySearchHistory(histories); - - // Set filterIds = searchFilters.stream() - // .map(SearchFilter::getId) - // .collect(Collectors.toSet()); - - Set filterIds = new HashSet<>(); - searchFilters.forEach(searchFilter -> filterIds.addAll(searchFilter.getFilters())); - - List filters = filterRepository.findByIds(filterIds); - - Map> grouped = filters.stream() - .collect(Collectors.groupingBy( - Filter::getType, - Collectors.mapping(Filter::getDisplayValue, Collectors.toList()))); - - return grouped.entrySet().stream() - .map(entry -> LibraryCompareResponseDTO.Filter.builder() - .key(entry.getKey()) - .values(entry.getValue()) - .build()) - .toList(); - } - - private void createLibraryPanels(Library library, List panelIds) { - List panels = panelRepository.findByIdList(panelIds); - - if (panels.size() != panelIds.size()) { - throw new ErrorHandler(ErrorStatus.BAD_REQUEST); - // TODO: 커스텀 에러 메시지 추가 시 활용 - "존재하지 않는 패널 ID가 있습니다" - } - - List libraryPanels = panels.stream() - .map(panel -> LibraryPanel.builder() - .id(new LibraryPanelKey(panel.getId(), library.getId())) - .library(library) - .panel(panel) - .build()) - .toList(); - - libraryPanelRepository.saveAll(libraryPanels); - } - - /** - * 라이브러리 대시보드 조회 (차트 포함) - */ - @Transactional(readOnly = true) - public LibraryResponseDTO.LibraryDashboard getLibraryDashboard(Long libraryId, Member member) { - // 1. 라이브러리 조회 및 권한 검증 - Library library = libraryRepository.findById(libraryId) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - if (!library.getMember().getId().equals(member.getId())) { - throw new ErrorHandler(ErrorStatus.FORBIDDEN); - } - - // 2. 패널 ID 배열 조회 - List panelIds = library.getPanelIds(); - if (panelIds == null || panelIds.isEmpty()) { - throw new ErrorHandler(ErrorStatus.BAD_REQUEST); - } - - // 3. 서브서버 API 호출 - FastLibraryChartRequestDTO request = FastLibraryChartRequestDTO.builder() - .panelIds(panelIds) - .libraryName(library.getLibraryName()) - .build(); - - FastLibraryChartResponseDTO.LibraryChartResponse chartResponse = fastApiService - .getChartsFromLibrary(request); - - // 4. 차트 데이터 변환 - LibraryResponseDTO.LibraryDashboard.ChartData mainChart = convertToChartData( - chartResponse.getMainChart()); - List subCharts = chartResponse.getSubCharts() - .stream() - .map(this::convertToChartData) - .toList(); - - // 5. 응답 구성 - return LibraryResponseDTO.LibraryDashboard.builder() - .libraryId(library.getId()) - .libraryName(library.getLibraryName()) - .panelCount(panelIds.size()) - .mainChart(mainChart) - .subCharts(subCharts) - .build(); - } - - /** - * 라이브러리 패널 목록 조회 (페이징, 일치율 없음) - */ - @Transactional(readOnly = true) - public LibraryResponseDTO.LibraryPanels getLibraryPanels(Long libraryId, Integer pageNum, Integer size, - Member member) { - // 1. 페이지 번호 예외처리 - if (pageNum < 1) { - throw new ErrorHandler(ErrorStatus.PAGE_NO_INVALID); - } - - // 2. 라이브러리 조회 및 권한 검증 - Library library = libraryRepository.findById(libraryId) - .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); - - if (!library.getMember().getId().equals(member.getId())) { - throw new ErrorHandler(ErrorStatus.FORBIDDEN); - } - - // 3. 패널 ID 배열 조회 - List panelIds = library.getPanelIds(); - if (panelIds == null || panelIds.isEmpty()) { - return LibraryResponseDTO.LibraryPanels.builder() - .keys(List.of("respondent_id", "gender", "age", "residence", - "personal_income")) - .values(List.of()) - .pageInfo(ResponsePageDTO.OffsetLimitPageInfo.builder() - .offset(0) - .currentPage(1) - .currentPageCount(0) - .totalPageCount(0) - .limit(size) - .totalCount(0L) - .hasNext(false) - .hasPrevious(false) - .build()) - .build(); - } - - // 4. 페이징을 위한 Pageable 객체 생성 - Pageable pageable = PageRequest.of(pageNum - 1, size); - - // 5. PanelId 목록을 이용해서 Panel 조회 - Page panelDtoList = searchPanelService.getPanelDtoList(panelIds, pageable); - - // 6. 페이지 범위 초과 검사 - if (pageNum > panelDtoList.getTotalPages() && panelDtoList.getTotalPages() > 0) { - throw new ErrorHandler(ErrorStatus.PAGE_NO_EXCEED); - } - - // 7. Panel 목록을 응답 형식으로 변환 (일치율 없음) - List values = panelDtoList.stream() - .map(panel -> LibraryResponseDTO.LibraryPanels.PanelResponseValues.builder() - .respondentId(panel.getId()) - .gender(panel.getGender() != null ? panel.getGender().getDisplayValue() - : null) - .age(panel.getAge() != null ? panel.getAge().toString() : null) - .residence(panel.getResidence()) - .personalIncome(panel.getPersonalIncome()) - .build()) - .toList(); - - // 8. 페이징 정보 생성 - ResponsePageDTO.OffsetLimitPageInfo pageInfo = ResponsePageDTO.OffsetLimitPageInfo - .from(panelDtoList); - - return LibraryResponseDTO.LibraryPanels.builder() - .keys(List.of("respondent_id", "gender", "age", "residence", "personal_income")) - .values(values) - .pageInfo(pageInfo) - .build(); - } - - /** - * FastAPI ChartData를 LibraryDashboard ChartData로 변환 - */ - private LibraryResponseDTO.LibraryDashboard.ChartData convertToChartData( - FastChartResponseDTO.ChartData fastChartData) { - if (fastChartData == null) { - return null; - } - - List dataPoints = fastChartData.getData() - .stream() - .map(this::convertToChartDataPoint) - .toList(); - - return LibraryResponseDTO.LibraryDashboard.ChartData.builder() - .chartType(fastChartData.getChartType()) - .metric(fastChartData.getMetric()) - .title(fastChartData.getTitle()) - .reasoning(fastChartData.getReasoning()) - .data(dataPoints) - .build(); - } - - /** - * FastAPI ChartDataPoint를 LibraryDashboard ChartDataPoint로 변환 - */ - private LibraryResponseDTO.LibraryDashboard.ChartDataPoint convertToChartDataPoint( - FastChartResponseDTO.ChartDataPoint fastDataPoint) { - if (fastDataPoint == null) { - return null; - } - - return LibraryResponseDTO.LibraryDashboard.ChartDataPoint.builder() - .category(fastDataPoint.getCategory()) - .value(fastDataPoint.getValue()) - .male(fastDataPoint.getMale()) - .maleMax(fastDataPoint.getMaleMax()) - .female(fastDataPoint.getFemale()) - .femaleMax(fastDataPoint.getFemaleMax()) - .id(fastDataPoint.getId()) - .name(fastDataPoint.getName()) - .build(); - } - - // 라이브러리 생성 결과를 담는 내부 클래스 - @lombok.Getter - @lombok.AllArgsConstructor - public static class LibraryCreateResult { - private final Library library; - private final int panelCount; - } -} \ No newline at end of file diff --git a/src/main/java/DiffLens/back_end/domain/library/service/analysis/LibraryAnalysisService.java b/src/main/java/DiffLens/back_end/domain/library/service/analysis/LibraryAnalysisService.java new file mode 100644 index 0000000..600281f --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/analysis/LibraryAnalysisService.java @@ -0,0 +1,12 @@ +package DiffLens.back_end.domain.library.service.analysis; + +import DiffLens.back_end.domain.library.dto.LibraryCompareRequestDTO; +import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO; +import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; +import DiffLens.back_end.domain.members.entity.Member; + +public interface LibraryAnalysisService { + LibraryCompareResponseDTO.CompareResult compareLibraries(LibraryCompareRequestDTO.Compare request, Member member); + + LibraryResponseDTO.LibraryDashboard getLibraryDashboard(Long libraryId, Member member); +} diff --git a/src/main/java/DiffLens/back_end/domain/library/service/analysis/LibraryAnalysisServiceImpl.java b/src/main/java/DiffLens/back_end/domain/library/service/analysis/LibraryAnalysisServiceImpl.java new file mode 100644 index 0000000..184f048 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/analysis/LibraryAnalysisServiceImpl.java @@ -0,0 +1,133 @@ +package DiffLens.back_end.domain.library.service.analysis; + +import DiffLens.back_end.domain.library.dto.LibraryCompareRedisKeySuffix; +import DiffLens.back_end.domain.library.dto.LibraryCompareRequestDTO; +import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO; +import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; +import DiffLens.back_end.domain.library.entity.Library; +import DiffLens.back_end.domain.library.repository.LibraryRepository; +import DiffLens.back_end.domain.library.service.cache.LibraryCompareCacheService; +import DiffLens.back_end.domain.library.utils.LibraryConvertUtils; +import DiffLens.back_end.domain.members.entity.Member; +import DiffLens.back_end.global.fastapi.FastApiService; +import DiffLens.back_end.global.fastapi.dto.request.FastLibraryChartRequestDTO; +import DiffLens.back_end.global.fastapi.dto.response.FastLibraryChartResponseDTO; +import DiffLens.back_end.global.fastapi.dto.response.FastLibraryCompareResponseDTO; +import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class LibraryAnalysisServiceImpl implements LibraryAnalysisService { + + private final LibraryRepository libraryRepository; + private final FastApiService fastApiService; + private final LibraryConvertUtils convertUtils; + private final LibraryCompareCacheService compareCacheService; + + @Transactional(readOnly = true) + public LibraryCompareResponseDTO.CompareResult compareLibraries(LibraryCompareRequestDTO.Compare request, Member member) { + + // 1. 두 라이브러리의 id가 같으면 예외 발생 + if (request.getLibraryId1().equals(request.getLibraryId2())) + throw new ErrorHandler(ErrorStatus.BAD_REQUEST); + + // 1-1. 라이브러리 객체 2개 생성 + Library lib1 = libraryRepository.findById(request.getLibraryId1()).orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + Library lib2 = libraryRepository.findById(request.getLibraryId2()).orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + + // 2. 캐시 조회 + // 2-1. redis Key에 쓰이는 정보 생성 + LibraryCompareRedisKeySuffix suffix = LibraryCompareRedisKeySuffix.of(request.getLibraryId1(), request.getLibraryId2()); + + // 2-2. redis에서 조회 + LibraryCompareResponseDTO.CompareResult cacheInfo = compareCacheService.getCacheInfo(suffix); + + // 2-3. redis에 데이터가 있으면 조회한거를 반환 + if( cacheInfo != null ){ + log.info("[API 호출중] 라이브러리 비교 정보를 정보를 캐시에서 조회"); + return cacheInfo; + } + + log.info("[API 호출중] 검색 추천 정보를 조회하기 위해 AI 로직 호출"); + + // 3. 조회된 라이브러리가 내꺼가 아니면 예외 발생 + if (!lib1.getMember().getId().equals(member.getId()) || !lib2.getMember().getId().equals(member.getId())) + throw new ErrorHandler(ErrorStatus.FORBIDDEN); + + // 4. 서브서버 요청해서 + var apiResp = fastApiService.compareLibraries(lib1.getId(), lib2.getId()); + LibraryCompareResponseDTO.CompareResult compareResult = makeCompareResult(apiResp, lib1, lib2); + + // 5. 캐시 저장 + compareCacheService.saveCacheInfo(suffix, compareResult); + + return compareResult; + } + + /** + * 라이브러리 대시보드 조회 (차트 포함) + */ + @Transactional(readOnly = true) + public LibraryResponseDTO.LibraryDashboard getLibraryDashboard(Long libraryId, Member member) { + // 1. 라이브러리 조회 및 권한 검증 + Library library = libraryRepository.findById(libraryId) + .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + + if (!library.getMember().getId().equals(member.getId())) { + throw new ErrorHandler(ErrorStatus.FORBIDDEN); + } + + // 2. 패널 ID 배열 조회 + List panelIds = library.getPanelIds(); + if (panelIds == null || panelIds.isEmpty()) { + throw new ErrorHandler(ErrorStatus.BAD_REQUEST); + } + + // 3. 서브서버 API 호출 + FastLibraryChartRequestDTO request = FastLibraryChartRequestDTO.builder() + .panelIds(panelIds) + .libraryName(library.getLibraryName()) + .build(); + + FastLibraryChartResponseDTO.LibraryChartResponse chartResponse = fastApiService.getChartsFromLibrary(request); + + // 4. 차트 데이터 변환 + LibraryResponseDTO.LibraryDashboard.ChartData mainChart = convertUtils.convertToChartData(chartResponse.getMainChart()); + List subCharts = chartResponse.getSubCharts() + .stream() + .map(convertUtils::convertToChartData) + .toList(); + + // 5. 응답 구성 + return LibraryResponseDTO.LibraryDashboard.builder() + .libraryId(library.getId()) + .libraryName(library.getLibraryName()) + .panelCount(panelIds.size()) + .mainChart(mainChart) + .subCharts(subCharts) + .build(); + } + + private LibraryCompareResponseDTO.CompareResult makeCompareResult(FastLibraryCompareResponseDTO.CompareResult apiResp, Library lib1, Library lib2) { + return LibraryCompareResponseDTO.CompareResult.builder() + .group1(convertUtils.convertGroupInfo(apiResp.getCohort1(), lib1)) + .group2(convertUtils.convertGroupInfo(apiResp.getCohort2(), lib2)) + .keyCharacteristics(convertUtils.convertCharacteristics(apiResp.getCharacteristics())) + .comparisons(convertUtils.convertBasicInfoComparisons( + apiResp.getBasicInfo(), + apiResp.getRegionDistribution(), + apiResp.getGenderDistribution())) + .insights(convertUtils.convertKeyInsights(apiResp.getKeyInsights())) + .build(); + } + + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/service/cache/LibraryCompareCacheService.java b/src/main/java/DiffLens/back_end/domain/library/service/cache/LibraryCompareCacheService.java new file mode 100644 index 0000000..592a921 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/cache/LibraryCompareCacheService.java @@ -0,0 +1,7 @@ +package DiffLens.back_end.domain.library.service.cache; + +import DiffLens.back_end.domain.library.dto.LibraryCompareRedisKeySuffix; +import DiffLens.back_end.global.redis.CacheService; + +public interface LibraryCompareCacheService extends CacheService { +} diff --git a/src/main/java/DiffLens/back_end/domain/library/service/cache/LibraryCompareCacheServiceImpl.java b/src/main/java/DiffLens/back_end/domain/library/service/cache/LibraryCompareCacheServiceImpl.java new file mode 100644 index 0000000..804f7f3 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/cache/LibraryCompareCacheServiceImpl.java @@ -0,0 +1,43 @@ +package DiffLens.back_end.domain.library.service.cache; + +import DiffLens.back_end.domain.library.dto.LibraryCompareRedisKeySuffix; +import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO; +import DiffLens.back_end.domain.search.repository.cache.RedisObjectCacheRepository; +import DiffLens.back_end.global.redis.CacheInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class LibraryCompareCacheServiceImpl implements LibraryCompareCacheService { + + // 캐시 정보를 관리하는 repository + private final RedisObjectCacheRepository cacheRepository; + + // 캐싱 정보 + private final CacheInfo cacheInfo = CacheInfo.Library_Compare; + + @Override + public LibraryCompareResponseDTO.CompareResult getCacheInfo(LibraryCompareRedisKeySuffix key) { + return cacheRepository.findByKey(getKey(key)); + } + + @Override + public void saveCacheInfo(LibraryCompareRedisKeySuffix key, LibraryCompareResponseDTO.CompareResult compareData) { + + String redisKey = getKey(key); + cacheRepository.save(redisKey, compareData, cacheInfo); + + } + + private String getKey(LibraryCompareRedisKeySuffix suffix){ + + Long lib1Id = suffix.lib1Id(); + Long lib2Id = suffix.lib2Id(); + + // 18-17 -> X + // 17-18 -> O + return cacheInfo.getPrefix() + Math.min(lib1Id, lib2Id) + "-" + Math.max(lib1Id, lib2Id); + } + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/service/command/LibraryCommandService.java b/src/main/java/DiffLens/back_end/domain/library/service/command/LibraryCommandService.java new file mode 100644 index 0000000..727a576 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/command/LibraryCommandService.java @@ -0,0 +1,11 @@ +package DiffLens.back_end.domain.library.service.command; + +import DiffLens.back_end.domain.library.dto.LibraryCreateResult; +import DiffLens.back_end.domain.library.dto.LibraryRequestDto; +import DiffLens.back_end.domain.members.entity.Member; + +public interface LibraryCommandService { + LibraryCreateResult createLibrary(LibraryRequestDto.Create request, Member member); + + LibraryCreateResult addSearchHistoryToLibrary(Long libraryId, Long searchHistoryId, Member member); +} diff --git a/src/main/java/DiffLens/back_end/domain/library/service/command/LibraryCommandServiceImpl.java b/src/main/java/DiffLens/back_end/domain/library/service/command/LibraryCommandServiceImpl.java new file mode 100644 index 0000000..5b02eb2 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/command/LibraryCommandServiceImpl.java @@ -0,0 +1,157 @@ +package DiffLens.back_end.domain.library.service.command; + +import DiffLens.back_end.domain.library.dto.LibraryCreateResult; +import DiffLens.back_end.domain.library.dto.LibraryRequestDto; +import DiffLens.back_end.domain.library.entity.*; +import DiffLens.back_end.domain.library.repository.LibraryPanelRepository; +import DiffLens.back_end.domain.library.repository.LibraryRepository; +import DiffLens.back_end.domain.library.repository.SearchHistoryLibraryRepository; +import DiffLens.back_end.domain.members.entity.Member; +import DiffLens.back_end.domain.panel.entity.Panel; +import DiffLens.back_end.domain.panel.repository.PanelRepository; +import DiffLens.back_end.domain.search.entity.SearchHistory; +import DiffLens.back_end.domain.search.repository.SearchHistoryRepository; +import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; +import DiffLens.back_end.global.responses.code.status.error.SearchStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Service +@RequiredArgsConstructor +public class LibraryCommandServiceImpl implements LibraryCommandService { + + private final SearchHistoryRepository searchHistoryRepository; + private final LibraryRepository libraryRepository; + private final SearchHistoryLibraryRepository searchHistoryLibraryRepository; + private final PanelRepository panelRepository; + private final LibraryPanelRepository libraryPanelRepository; + + @Transactional + public LibraryCreateResult createLibrary(LibraryRequestDto.Create request, Member member) { + + // 1. SearchHistory 검증 + SearchHistory history = searchHistoryRepository.findById(request.getSearchHistoryId()) + .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + + // 2. 권한 검증 - 본인의 검색 기록만 라이브러리로 저장 가능 + if (!history.getMember().getId().equals(member.getId())) { + throw new ErrorHandler(ErrorStatus.FORBIDDEN); + } + + // 3. Library 생성 (SearchHistory 참조 제거) + // 패널 ID 결정: 요청에 있으면 사용, 없으면 검색기록의 패널 ID 사용 + List panelIds = request.getPanelIds() != null + ? request.getPanelIds() + : history.getPanelIds(); + + Library library = Library.builder() + .libraryName(request.getLibraryName()) + .tags(request.getTags()) + .panelIds(panelIds != null ? panelIds : List.of()) + .member(member) + .build(); + + library = libraryRepository.save(library); + + // 4. Library-SearchHistory 다대다 관계 생성 + SearchHistoryLibrary searchHistoryLibrary = SearchHistoryLibrary.builder() + .id(new SearchHistoryLibraryKey(history.getId(), library.getId())) + .library(library) + .history(history) + .build(); + + searchHistoryLibraryRepository.save(searchHistoryLibrary); + + // 5. Panel 관계 생성 + int panelCount = 0; + if (panelIds != null && !panelIds.isEmpty()) { + createLibraryPanels(library, panelIds); + panelCount = panelIds.size(); + } + + return LibraryCreateResult.of(library, panelCount); + } + + @Transactional + public LibraryCreateResult addSearchHistoryToLibrary(Long libraryId, Long searchHistoryId, Member member) { + // 1. 라이브러리 조회 및 권한 검증 + Library library = libraryRepository.findById(libraryId) + .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + + if (!library.getMember().getId().equals(member.getId())) { + throw new ErrorHandler(ErrorStatus.FORBIDDEN); + } + + // 2. 검색기록 조회 및 권한 검증 + SearchHistory searchHistory = searchHistoryRepository.findById(searchHistoryId) + .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + + if (!searchHistory.getMember().getId().equals(member.getId())) { + throw new ErrorHandler(ErrorStatus.FORBIDDEN); + } + + // 3. 패널 ID 병합 (중복 제거) + List existingPanelIds = library.getPanelIds(); + List newPanelIds = searchHistory.getPanelIds(); + List mergedPanelIds = Stream.concat( + existingPanelIds.stream(), + newPanelIds.stream()).distinct().collect(Collectors.toList()); + + // 4. 새로운 패널들만 LibraryPanel에 추가 + List newPanelsToAdd = newPanelIds.stream() + .filter(panelId -> !existingPanelIds.contains(panelId)) + .collect(Collectors.toList()); + + int addedPanelCount = 0; + if (!newPanelsToAdd.isEmpty()) { + createLibraryPanels(library, newPanelsToAdd); + addedPanelCount = newPanelsToAdd.size(); + } + + // 5. Library 엔티티의 panelIds 업데이트 + // 기존 엔티티의 panelIds만 업데이트 (AuditingEntityListener가 updatedAt 자동 관리) + library.setPanelIds(mergedPanelIds); + library = libraryRepository.save(library); + + // 6. SearchHistoryLibrary 관계 생성 (존재하지 않을 때만) + SearchHistoryLibraryKey searchHistoryLibraryKey = new SearchHistoryLibraryKey(searchHistoryId, + libraryId); + boolean relationshipExists = searchHistoryLibraryRepository.existsById(searchHistoryLibraryKey); + + if (!relationshipExists) { + SearchHistoryLibrary searchHistoryLibrary = SearchHistoryLibrary.builder() + .id(searchHistoryLibraryKey) + .library(library) + .history(searchHistory) + .build(); + searchHistoryLibraryRepository.save(searchHistoryLibrary); + } + + return LibraryCreateResult.of(library, addedPanelCount); + } + + private void createLibraryPanels(Library library, List panelIds) { + List panels = panelRepository.findByIdList(panelIds); + + if (panels.size() != panelIds.size()) { + throw new ErrorHandler(SearchStatus.NO_RESULT); + } + + List libraryPanels = panels.stream() + .map(panel -> LibraryPanel.builder() + .id(new LibraryPanelKey(panel.getId(), library.getId())) + .library(library) + .panel(panel) + .build()) + .toList(); + + libraryPanelRepository.saveAll(libraryPanels); + } + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/service/query/LibraryQueryService.java b/src/main/java/DiffLens/back_end/domain/library/service/query/LibraryQueryService.java new file mode 100644 index 0000000..c5cb259 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/query/LibraryQueryService.java @@ -0,0 +1,12 @@ +package DiffLens.back_end.domain.library.service.query; + +import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; +import DiffLens.back_end.domain.members.entity.Member; + +public interface LibraryQueryService { + LibraryResponseDTO.ListResult getLibrariesByMember(Member member); + + LibraryResponseDTO.LibraryDetail getLibraryDetail(Long libraryId, Member member); + + LibraryResponseDTO.LibraryPanels getLibraryPanels(Long libraryId, Integer pageNum, Integer size, Member member); +} diff --git a/src/main/java/DiffLens/back_end/domain/library/service/query/LibraryQueryServiceImpl.java b/src/main/java/DiffLens/back_end/domain/library/service/query/LibraryQueryServiceImpl.java new file mode 100644 index 0000000..bc2c7df --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/service/query/LibraryQueryServiceImpl.java @@ -0,0 +1,151 @@ +package DiffLens.back_end.domain.library.service.query; + +import DiffLens.back_end.domain.library.converter.dtoConvert.LibraryQueryConverter; +import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; +import DiffLens.back_end.domain.library.entity.Library; +import DiffLens.back_end.domain.library.entity.SearchHistoryLibrary; +import DiffLens.back_end.domain.library.repository.LibraryPanelRepository; +import DiffLens.back_end.domain.library.repository.LibraryRepository; +import DiffLens.back_end.domain.library.repository.SearchHistoryLibraryRepository; +import DiffLens.back_end.domain.library.utils.LibraryStatisticUtils; +import DiffLens.back_end.domain.members.entity.Member; +import DiffLens.back_end.domain.panel.entity.Panel; +import DiffLens.back_end.domain.panel.repository.PanelRepository; +import DiffLens.back_end.domain.panel.repository.projection.PanelWithRawDataDTO; +import DiffLens.back_end.domain.search.entity.SearchHistory; +import DiffLens.back_end.domain.search.service.interfaces.SearchPanelService; +import DiffLens.back_end.global.dto.ResponsePageDTO; +import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class LibraryQueryServiceImpl implements LibraryQueryService { + + private final LibraryRepository libraryRepository; + private final LibraryPanelRepository libraryPanelRepository; + private final PanelRepository panelRepository; + private final SearchHistoryLibraryRepository searchHistoryLibraryRepository; + + private final SearchPanelService searchPanelService; + + @Transactional(readOnly = true) + public LibraryResponseDTO.ListResult getLibrariesByMember(Member member) { + List libraries = libraryRepository.findByMemberOrderByCreatedDateDesc(member); + + List libraryItems = libraries.stream() + .map(library -> { + int panelCount = libraryPanelRepository.countByLibraryId(library.getId()); + return LibraryResponseDTO.ListResult.LibraryItem.from(library, panelCount); + }) + .toList(); + + return LibraryResponseDTO.ListResult.builder() + .libraries(libraryItems) + .cursorPageInfo(null) // 페이징이 필요하면 추후 구현 + .build(); + } + + @Transactional(readOnly = true) + public LibraryResponseDTO.LibraryDetail getLibraryDetail(Long libraryId, Member member) { + // 1. 라이브러리 조회 및 권한 검증 + Library library = libraryRepository.findById(libraryId) + .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + + if (!library.getMember().getId().equals(member.getId())) { + throw new ErrorHandler(ErrorStatus.FORBIDDEN); + } + + // 2. 패널 정보 조회 + List panels = panelRepository.findByIdList(library.getPanelIds()); + List panelInfos = LibraryQueryConverter.toPanelInfos(panels); + + // 3. 연결된 검색기록 조회 + List searchHistoryLibraries = searchHistoryLibraryRepository + .findByLibraryId(libraryId); + List searchHistoryInfos = LibraryQueryConverter.toSearchHistoryInfos(searchHistoryLibraries); + + // 4. 통계 정보 생성 + LibraryResponseDTO.LibraryDetail.Statistics statistics = LibraryStatisticUtils.createStatistics(panels); + + return LibraryResponseDTO.LibraryDetail.builder() + .libraryId(library.getId()) + .libraryName(library.getLibraryName()) + .tags(library.getTags()) + .panelCount(panels.size()) + .panelIds(library.getPanelIds()) + .panels(panelInfos) + .searchHistories(searchHistoryInfos) + .statistics(statistics) + .createdAt(library.getCreatedDate() != null ? library.getCreatedDate().toString() : null) + .updatedAt(library.getUpdatedAt() != null ? library.getUpdatedAt().toString() : null) + .build(); + } + + /** + * 라이브러리 패널 목록 조회 (페이징, 일치율 없음) + */ + @Transactional(readOnly = true) + public LibraryResponseDTO.LibraryPanels getLibraryPanels(Long libraryId, Integer pageNum, Integer size, + Member member) { + // 1. 페이지 번호 예외처리 + if (pageNum < 1) { + throw new ErrorHandler(ErrorStatus.PAGE_NO_INVALID); + } + + // 2. 라이브러리 조회 및 권한 검증 + Library library = libraryRepository.findById(libraryId) + .orElseThrow(() -> new ErrorHandler(ErrorStatus.BAD_REQUEST)); + + if (!library.getMember().getId().equals(member.getId())) { + throw new ErrorHandler(ErrorStatus.FORBIDDEN); + } + + // 3. 패널 ID 배열 조회 + List panelIds = library.getPanelIds(); + if (panelIds == null || panelIds.isEmpty()) { + return LibraryQueryConverter.emptyPanelResponse(size); + } + + // 4. 페이징을 위한 Pageable 객체 생성 + Pageable pageable = PageRequest.of(pageNum - 1, size); + + // 5. PanelId 목록을 이용해서 Panel 조회 + Page panelDtoList = searchPanelService.getPanelDtoList(panelIds, pageable); + + // 6. 페이지 범위 초과 검사 + if (pageNum > panelDtoList.getTotalPages() && panelDtoList.getTotalPages() > 0) { + throw new ErrorHandler(ErrorStatus.PAGE_NO_EXCEED); + } + + // 7. Panel 목록을 응답 형식으로 변환 (일치율 없음) + List values = panelDtoList.stream() + .map(panel -> LibraryResponseDTO.LibraryPanels.PanelResponseValues.builder() + .respondentId(panel.getId()) + .gender(panel.getGender() != null ? panel.getGender().getDisplayValue() : null) + .age(panel.getAge() != null ? panel.getAge().toString() : null) + .residence(panel.getResidence()) + .personalIncome(panel.getPersonalIncome()) + .build()) + .toList(); + + // 8. 페이징 정보 생성 + ResponsePageDTO.OffsetLimitPageInfo pageInfo = ResponsePageDTO.OffsetLimitPageInfo + .from(panelDtoList); + + return LibraryResponseDTO.LibraryPanels.builder() + .keys(List.of("respondent_id", "gender", "age", "residence", "personal_income")) + .values(values) + .pageInfo(pageInfo) + .build(); + } + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/utils/LibraryConvertUtils.java b/src/main/java/DiffLens/back_end/domain/library/utils/LibraryConvertUtils.java new file mode 100644 index 0000000..8ae9697 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/utils/LibraryConvertUtils.java @@ -0,0 +1,215 @@ +package DiffLens.back_end.domain.library.utils; + +import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO; +import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; +import DiffLens.back_end.domain.library.entity.Library; +import DiffLens.back_end.domain.library.entity.SearchHistoryLibrary; +import DiffLens.back_end.domain.library.repository.SearchHistoryLibraryRepository; +import DiffLens.back_end.domain.search.entity.Filter; +import DiffLens.back_end.domain.search.entity.SearchFilter; +import DiffLens.back_end.domain.search.entity.SearchHistory; +import DiffLens.back_end.domain.search.repository.FilterRepository; +import DiffLens.back_end.domain.search.repository.SearchFilterRepository; +import DiffLens.back_end.global.fastapi.dto.response.FastChartResponseDTO; +import DiffLens.back_end.global.fastapi.dto.response.FastLibraryCompareResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + + +/** + * + * LibraryConvertUtils + * ------------------- + * Library 관련 DTO 및 FastAPI 응답 데이터를 변환하는 유틸리티 클래스. + * LibraryAnalysisServiceImpl 등에서 재사용 가능하도록 변환 로직을 통합. + * + * convertKeyInsights(): KeyInsights를 LibraryCompareResponseDTO.Insights로 변환 (nullable 처리) + * convertToChartData(): FastAPI ChartData를 LibraryResponseDTO.LibraryDashboard.ChartData로 변환 + * convertToChartDataPoint(): FastAPI ChartDataPoint를 LibraryResponseDTO.LibraryDashboard.ChartDataPoint로 변환 + * convertGroupInfo(): CohortBasicInfo를 LibraryCompareResponseDTO.GroupInfo로 변환 + * convertFilters(): Library 객체의 SearchFilter 및 Filter 데이터를 LibraryCompareResponseDTO.Filter 리스트로 변환 + * convertCharacteristics(): CharacteristicComparison 리스트를 LibraryCompareResponseDTO.KeyCharacteristic 리스트로 변환 + * convertBasicInfoComparisons(): BasicInfoComparison, RegionDistribution, GenderDistribution 데이터를 LibraryCompareResponseDTO.Comparisons로 변환 + * + */ +@Component +@RequiredArgsConstructor +public class LibraryConvertUtils { + + private final FilterRepository filterRepository; + private final SearchFilterRepository searchFilterRepository; + private final SearchHistoryLibraryRepository searchHistoryLibraryRepository; + + /** + * KeyInsights를 Insights로 변환 (nullable 처리) + */ + public LibraryCompareResponseDTO.Insights convertKeyInsights(FastLibraryCompareResponseDTO.KeyInsights keyInsights) { + if (keyInsights == null) return null; + return LibraryCompareResponseDTO.Insights.builder() + .difference(keyInsights.getMainDifferences()) + .common(keyInsights.getCommonalities()) + .implication(keyInsights.getImplications()) + .build(); + } + + /** + * FastAPI ChartData를 LibraryDashboard ChartData로 변환 + */ + public LibraryResponseDTO.LibraryDashboard.ChartData convertToChartData(FastChartResponseDTO.ChartData chart) { + if (chart == null) return null; + + List points = chart.getData().stream() + .map(this::convertToChartDataPoint) + .toList(); + + return LibraryResponseDTO.LibraryDashboard.ChartData.builder() + .chartType(chart.getChartType()) + .metric(chart.getMetric()) + .title(chart.getTitle()) + .reasoning(chart.getReasoning()) + .data(points) + .build(); + } + + /** + * FastAPI ChartDataPoint를 LibraryDashboard ChartDataPoint로 변환 + */ + public LibraryResponseDTO.LibraryDashboard.ChartDataPoint convertToChartDataPoint(FastChartResponseDTO.ChartDataPoint point) { + if (point == null) return null; + + return LibraryResponseDTO.LibraryDashboard.ChartDataPoint.builder() + .category(point.getCategory()) + .value(point.getValue()) + .male(point.getMale()) + .maleMax(point.getMaleMax()) + .female(point.getFemale()) + .femaleMax(point.getFemaleMax()) + .id(point.getId()) + .name(point.getName()) + .build(); + } + + /** + * CohortBasicInfo를 GroupInfo로 변환 + */ + public LibraryCompareResponseDTO.GroupInfo convertGroupInfo(FastLibraryCompareResponseDTO.CohortBasicInfo cohortInfo, Library library) { + return LibraryCompareResponseDTO.GroupInfo.builder() + .libraryId(Long.parseLong(cohortInfo.getCohortId())) + .libraryName(cohortInfo.getCohortName()) + .totalCount(cohortInfo.getPanelCount()) + .filters(convertFilters(library)) + .build(); + } + + public List convertFilters(Library library) { + List searchHistoryLibraries = searchHistoryLibraryRepository + .findByLibraryId(library.getId()); + + List histories = searchHistoryLibraries.stream() + .map(SearchHistoryLibrary::getHistory) + .toList(); + + List searchFilters = searchFilterRepository.findBySearchHistory(histories); + + Set filterIds = new HashSet<>(); + searchFilters.forEach(sf -> filterIds.addAll(sf.getFilters())); + + List filters = filterRepository.findByIds(filterIds); + + Map> grouped = filters.stream() + .collect(Collectors.groupingBy( + Filter::getType, + Collectors.mapping(Filter::getDisplayValue, Collectors.toList()) + )); + + return grouped.entrySet().stream() + .map(e -> LibraryCompareResponseDTO.Filter.builder() + .key(e.getKey()) + .values(e.getValue()) + .build()) + .toList(); + } + + /** + * CharacteristicComparison 리스트를 KeyCharacteristic 리스트로 변환 + */ + public List convertCharacteristics( + List characteristics) { + + if (characteristics == null || characteristics.isEmpty()) return List.of(); + + return characteristics.stream() + .map(f -> LibraryCompareResponseDTO.KeyCharacteristic.builder() + .characteristic(f.getCharacteristic()) + .description(null) + .group1Percentage(Optional.ofNullable(f.getCohort1Percentage()).map(Number::intValue).orElse(0)) + .group2Percentage(Optional.ofNullable(f.getCohort2Percentage()).map(Number::intValue).orElse(0)) + .difference(Optional.ofNullable(f.getDifferencePercentage()).map(Number::intValue).orElse(0)) + .build()) + .toList(); + } + + /** + * BasicInfoComparison 리스트를 Comparisons로 변환 + * basic_info에서 메트릭별로 값을 추출하여 GroupMetrics 구성 + * region_distribution 데이터를 group1, group2의 지역 필드에 매핑 + * gender_distribution 데이터를 group1, group2의 성별 필드에 매핑 + */ + public LibraryCompareResponseDTO.Comparisons convertBasicInfoComparisons( + List basicInfo, + FastLibraryCompareResponseDTO.RegionDistribution region, + FastLibraryCompareResponseDTO.GenderDistribution gender) { + + // basic_info에서 메트릭별로 값 추출 + LibraryCompareResponseDTO.GroupMetrics.GroupMetricsBuilder g1 = LibraryCompareResponseDTO.GroupMetrics.builder(); + LibraryCompareResponseDTO.GroupMetrics.GroupMetricsBuilder g2 = LibraryCompareResponseDTO.GroupMetrics.builder(); + + if (basicInfo != null) { + basicInfo.forEach(info -> { + String metric = info.getMetricName(); + Double c1 = info.getCohort1Value(); + Double c2 = info.getCohort2Value(); + switch (metric) { + case "age" -> { if (c1 != null) g1.avgAge(c1); if (c2 != null) g2.avgAge(c2); } + case "family_size" -> { if (c1 != null) g1.avgFamily(c1); if (c2 != null) g2.avgFamily(c2); } + case "children_count" -> { if (c1 != null) g1.avgChildren(c1); if (c2 != null) g2.avgChildren(c2); } + case "personal_income" -> { if (c1 != null) g1.avgPersonalIncome(c1.intValue()); if (c2 != null) g2.avgPersonalIncome(c2.intValue()); } + case "household_income" -> { if (c1 != null) g1.avgFamilyIncome(c1.intValue()); if (c2 != null) g2.avgFamilyIncome(c2.intValue()); } + case "car_ownership" -> { if (c1 != null) g1.ratePossessingCar(c1.intValue()); if (c2 != null) g2.ratePossessingCar(c2.intValue()); } + } + }); + } + + // region_distribution 데이터를 group1, group2의 지역 필드에 매핑 + if (region != null) { + Map r1 = Optional.ofNullable(region.getCohort1()).orElse(Map.of()); + Map r2 = Optional.ofNullable(region.getCohort2()).orElse(Map.of()); + g1.seoul(r1.getOrDefault("서울", 0.0).intValue()); + g1.gyeonggi(r1.getOrDefault("경기", 0.0).intValue()); + g1.busan(r1.getOrDefault("부산", 0.0).intValue()); + g1.regionEtc(r1.getOrDefault("기타", 0.0).intValue()); + g2.seoul(r2.getOrDefault("서울", 0.0).intValue()); + g2.gyeonggi(r2.getOrDefault("경기", 0.0).intValue()); + g2.busan(r2.getOrDefault("부산", 0.0).intValue()); + g2.regionEtc(r2.getOrDefault("기타", 0.0).intValue()); + } + + // gender_distribution 데이터를 group1, group2의 성별 필드에 매핑 + if (gender != null) { + Map gend1 = Optional.ofNullable(gender.getCohort1()).orElse(Map.of()); + Map gend2 = Optional.ofNullable(gender.getCohort2()).orElse(Map.of()); + g1.male(gend1.getOrDefault("남성", 0.0).intValue()); + g1.female(gend1.getOrDefault("여성", 0.0).intValue()); + g2.male(gend2.getOrDefault("남성", 0.0).intValue()); + g2.female(gend2.getOrDefault("여성", 0.0).intValue()); + } + + return LibraryCompareResponseDTO.Comparisons.builder() + .group1(g1.build()) + .group2(g2.build()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/DiffLens/back_end/domain/library/utils/LibraryStatisticUtils.java b/src/main/java/DiffLens/back_end/domain/library/utils/LibraryStatisticUtils.java new file mode 100644 index 0000000..ec1322c --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/utils/LibraryStatisticUtils.java @@ -0,0 +1,73 @@ +package DiffLens.back_end.domain.library.utils; + +import DiffLens.back_end.domain.library.dto.LibraryResponseDTO; +import DiffLens.back_end.domain.panel.entity.Panel; + +import java.util.List; + +public class LibraryStatisticUtils { + + // 추후 혹시 라이브러리 상세 페이지에서 간단한 통계 디자인 생길 것 대비해 작성해둠 + public static LibraryResponseDTO.LibraryDetail.Statistics createStatistics(List panels) { + // 성별 분포 + long maleCount = panels.stream() + .filter(p -> p.getGender() != null && p.getGender().toString().equals("MALE")).count(); + long femaleCount = panels.stream() + .filter(p -> p.getGender() != null && p.getGender().toString().equals("FEMALE")) + .count(); + long noneCount = panels.stream() + .filter(p -> p.getGender() != null && p.getGender().toString().equals("NONE")).count(); + + LibraryResponseDTO.LibraryDetail.Statistics.GenderDistribution genderDistribution = LibraryResponseDTO.LibraryDetail.Statistics.GenderDistribution + .builder() + .male((int) maleCount) + .female((int) femaleCount) + .none((int) noneCount) + .build(); + + // 연령대 분포 + long twenties = panels.stream().filter(p -> "20대".equals(p.getAgeGroup())).count(); + long thirties = panels.stream().filter(p -> "30대".equals(p.getAgeGroup())).count(); + long forties = panels.stream().filter(p -> "40대".equals(p.getAgeGroup())).count(); + long fifties = panels.stream().filter(p -> "50대".equals(p.getAgeGroup())).count(); + long sixtiesPlus = panels.stream().filter(p -> p.getAgeGroup() != null && + (p.getAgeGroup().contains("60") || p.getAgeGroup().contains("70") + || p.getAgeGroup().contains("80"))) + .count(); + + LibraryResponseDTO.LibraryDetail.Statistics.AgeGroupDistribution ageGroupDistribution = LibraryResponseDTO.LibraryDetail.Statistics.AgeGroupDistribution + .builder() + .twenties((int) twenties) + .thirties((int) thirties) + .forties((int) forties) + .fifties((int) fifties) + .sixtiesPlus((int) sixtiesPlus) + .build(); + + // 거주지 분포 + long seoul = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("서울")) + .count(); + long gyeonggi = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("경기")) + .count(); + long busan = panels.stream().filter(p -> p.getRegion() != null && p.getRegion().contains("부산")) + .count(); + long other = panels.size() - seoul - gyeonggi - busan; + + LibraryResponseDTO.LibraryDetail.Statistics.ResidenceDistribution residenceDistribution = LibraryResponseDTO.LibraryDetail.Statistics.ResidenceDistribution + .builder() + .seoul((int) seoul) + .gyeonggi((int) gyeonggi) + .busan((int) busan) + .other((int) other) + .build(); + + return LibraryResponseDTO.LibraryDetail.Statistics.builder() + .totalPanels(panels.size()) + .genderDistribution(genderDistribution) + .ageGroupDistribution(ageGroupDistribution) + .residenceDistribution(residenceDistribution) + .build(); + } + + +} diff --git a/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheService.java b/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheService.java index 897ac9a..f6d6dff 100644 --- a/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheService.java +++ b/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheService.java @@ -9,6 +9,15 @@ * * @param 캐시로 다룰 데이터 */ -public interface PanelInfoCacheService extends CacheService { +public class PanelInfoCacheService implements CacheService { + @Override + public T getCacheInfo(Panel key) { + return null; + } + + @Override + public void saveCacheInfo(Panel data, T cacheInfo) { + + } } diff --git a/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheServiceImpl.java b/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheServiceImpl.java index 4e0e333..93c36c4 100644 --- a/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheServiceImpl.java +++ b/src/main/java/DiffLens/back_end/domain/panel/service/PanelInfoCacheServiceImpl.java @@ -1,7 +1,7 @@ package DiffLens.back_end.domain.panel.service; import DiffLens.back_end.domain.panel.entity.Panel; -import DiffLens.back_end.domain.search.repository.cache.RedisRecommendationCacheRepository; +import DiffLens.back_end.domain.search.repository.cache.RedisObjectCacheRepository; import lombok.RequiredArgsConstructor; /** @@ -11,12 +11,12 @@ * */ @RequiredArgsConstructor -public class PanelInfoCacheServiceImpl implements PanelInfoCacheService{ +public class PanelInfoCacheServiceImpl extends PanelInfoCacheService{ private static final Integer TTL = 10; // 캐시 정보를 관리하는 repository - private final RedisRecommendationCacheRepository cacheRepository; + private final RedisObjectCacheRepository cacheRepository; // 캐시 Key 접두사 private static final String CACHE_KEY_PREFIX = "search:recommend:"; // search:recommend:{memberId} 형식으로 key 지정할 예정 diff --git a/src/main/java/DiffLens/back_end/domain/search/repository/cache/RedisObjectCacheRepository.java b/src/main/java/DiffLens/back_end/domain/search/repository/cache/RedisObjectCacheRepository.java new file mode 100644 index 0000000..71ac39a --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/search/repository/cache/RedisObjectCacheRepository.java @@ -0,0 +1,61 @@ +package DiffLens.back_end.domain.search.repository.cache; + +import DiffLens.back_end.global.redis.CacheInfo; +import DiffLens.back_end.global.redis.RedisCacheRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Repository; + +import java.util.function.Supplier; + +/** + * 캐시 데이터를 관리하는 redis Repository + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class RedisObjectCacheRepository implements RedisCacheRepository { + + private final RedisTemplate redisTemplate; + + // 저장 + @Override + public boolean save(String key, Object value, CacheInfo cacheInfo) { + try{ + redisTemplate.opsForValue().set(key, value, cacheInfo.getTTL(), cacheInfo.getTimeUnit()); + }catch(Exception e){ + log.error("[캐싱] 캐시 저장 중 오류 발생 - {}", e.getMessage()); + return false; + } + return true; + } + + @Override + @SuppressWarnings("unchecked") + public T findByKey(String key){ + return (T) redisTemplate.opsForValue().get(key); + } + + @Override + public T findOrElse(String key, Supplier supplier, CacheInfo cacheInfo) { + T value = findByKey(key); + if (value == null) { + value = supplier.get(); + save(key, value, cacheInfo); + } + return value; + } + + @Override + public boolean delete(String key) { + try{ + redisTemplate.delete(key); + }catch(Exception e){ + log.error("[캐싱] 캐시 삭제 중 오류 발생 - {}", e.getMessage()); + return false; + } + return true; + } + +} diff --git a/src/main/java/DiffLens/back_end/domain/search/repository/cache/RedisRecommendationCacheRepository.java b/src/main/java/DiffLens/back_end/domain/search/repository/cache/RedisRecommendationCacheRepository.java deleted file mode 100644 index cc5166d..0000000 --- a/src/main/java/DiffLens/back_end/domain/search/repository/cache/RedisRecommendationCacheRepository.java +++ /dev/null @@ -1,44 +0,0 @@ -package DiffLens.back_end.domain.search.repository.cache; - -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Repository; - -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -/** - * 추천 검색어를 관리하는 redis Repository - */ -@Repository -@RequiredArgsConstructor -public class RedisRecommendationCacheRepository { - - private final static TimeUnit timeUnit = TimeUnit.MINUTES; - - private final RedisTemplate redisTemplate; - - // 저장 - public void save(String key, Object value, int ttl) { - redisTemplate.opsForValue().set(key, value, ttl, timeUnit); - } - - @SuppressWarnings("unchecked") - public T findByKey(String key){ - return (T) redisTemplate.opsForValue().get(key); - } - - public T findOrElse(String key, Supplier supplier, int ttl) { - T value = findByKey(key); - if (value == null) { - value = supplier.get(); - save(key, value, ttl); - } - return value; - } - - public void delete(String key) { - redisTemplate.delete(key); - } - -} diff --git a/src/main/java/DiffLens/back_end/domain/search/service/implement/NaturalSearchService.java b/src/main/java/DiffLens/back_end/domain/search/service/implement/NaturalSearchService.java index 901e7f8..e5b5c78 100644 --- a/src/main/java/DiffLens/back_end/domain/search/service/implement/NaturalSearchService.java +++ b/src/main/java/DiffLens/back_end/domain/search/service/implement/NaturalSearchService.java @@ -17,6 +17,7 @@ import DiffLens.back_end.domain.search.service.interfaces.SearchService; import DiffLens.back_end.global.fastapi.dto.response.MainSearchResponse; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,6 +28,7 @@ /** * 자연어 Service --> SearchService 구현 */ +@Slf4j @Service("naturalSearchService") @RequiredArgsConstructor public class NaturalSearchService implements SearchService { @@ -47,6 +49,9 @@ public class NaturalSearchService implements SearchService { - private static final Integer TTL = 10; - // 캐시 정보를 관리하는 repository - private final RedisRecommendationCacheRepository cacheRepository; + private final RedisObjectCacheRepository cacheRepository; - // 추천 정보를 저장하는 키의 접두사( Prefix ) - private static final String CACHE_KEY_PREFIX = "search:recommend:"; // search:recommend:{memberId} 형식으로 key 지정할 예정 + // 캐싱 정보 + private final CacheInfo cacheInfo = CacheInfo.Search_Recommendation; // 저장되어있는 추천정보를 꺼냄 @Override @@ -32,12 +31,12 @@ public FastHomeResponseDTO.HomeRecommend getCacheInfo(Member member) { // 추천정보를 캐시에 저장함 @Override - public void saveCacheInfo(Member member, FastHomeResponseDTO.HomeRecommend cacheInfo) { - cacheRepository.save(getKey(member), cacheInfo, TTL); + public void saveCacheInfo(Member member, FastHomeResponseDTO.HomeRecommend recommend) { + cacheRepository.save(getKey(member), recommend, cacheInfo); } private String getKey(Member member) { - return CACHE_KEY_PREFIX + member.getId(); + return cacheInfo.getPrefix() + member.getId(); } } diff --git a/src/main/java/DiffLens/back_end/domain/search/service/interfaces/RecommendSearchCacheService.java b/src/main/java/DiffLens/back_end/domain/search/service/interfaces/RecommendSearchCacheService.java index 92a5c7b..555acdb 100644 --- a/src/main/java/DiffLens/back_end/domain/search/service/interfaces/RecommendSearchCacheService.java +++ b/src/main/java/DiffLens/back_end/domain/search/service/interfaces/RecommendSearchCacheService.java @@ -11,6 +11,4 @@ */ public interface RecommendSearchCacheService extends CacheService { - - } diff --git a/src/main/java/DiffLens/back_end/global/fastapi/FastApiClient.java b/src/main/java/DiffLens/back_end/global/fastapi/FastApiClient.java deleted file mode 100644 index f5ccfa7..0000000 --- a/src/main/java/DiffLens/back_end/global/fastapi/FastApiClient.java +++ /dev/null @@ -1,162 +0,0 @@ -package DiffLens.back_end.global.fastapi; - -import DiffLens.back_end.global.aop.annotations.LogExecutionTime; -import DiffLens.back_end.global.fastapi.dto.FastApiErrorDto; -import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; -import DiffLens.back_end.global.responses.code.status.error.SearchStatus; -import DiffLens.back_end.global.responses.exception.GeneralException; -import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.HttpStatusCode; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; -import reactor.core.publisher.Mono; - -/** - * FastAPI 서버에 실제 HTTP 요청을 보냄 - */ -@Component -@RequiredArgsConstructor -public class FastApiClient { - - private final WebClient fastApiWebClient; - - /** - * - * @param type fast api에 보낼 요청을 관리하는 enum - FastApiRequestType - * @param requestBody fast api에 요청 보낼 클래스의 타입 - * @return fast api 로부터 응답받은 데이터 ( R ) - * @param request body의 클래스 - * @param response body의 클래스 - * - */ - @LogExecutionTime("서브서버 호출 소요시간") - public R sendRequest(FastApiRequestType type, T requestBody) { - - // 요청 타입이 맞지 않을 경우에 대한 예외 - if (!type.getRequestBody().isInstance(requestBody)) { - throw new IllegalArgumentException("올바르지 않은 요청 타입 " + type.name()); // TODO : 에외처리... - } - - R block = null; - try { - block = fastApiWebClient.post() - .uri(type.getUri()) - .bodyValue(requestBody) - .retrieve() - .bodyToMono((Class) type.getResponseType()) - .block(); - } catch (Exception e) { // fast api 호출 중 에러 발생시 예외 발생 - throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); - } - - return block; - } - - /** - * PathVariable을 사용하는 GET 요청 - * - * @param type fast api에 보낼 요청을 관리하는 enum - FastApiRequestType - * @param requestBody 요청 본문 (null 가능) - * @param pathVariables URI에 포함될 경로 변수들 - * @return fast api 로부터 응답받은 데이터 ( R ) - * @param request body의 클래스 - * @param response body의 클래스 - */ - @LogExecutionTime("서브서버 호출 소요시간") - public R sendRequestWithPathVariable( - FastApiRequestType type, - T requestBody, - Object... pathVariables - ) { - try { - return fastApiWebClient.get() - .uri(type.getUri(), pathVariables) - .exchangeToMono(response -> { - HttpStatusCode status = response.statusCode(); - - if (status.is4xxClientError() || status.is5xxServerError()) { - return response.bodyToMono(FastApiErrorDto.class) - .flatMap(errorDto -> { - String detail = errorDto.getDetail(); - - if ("해당 검색 결과에는 패널이 없습니다.".equals(detail)) { - return Mono.error(new ErrorHandler( - SearchStatus.NO_RESULT - )); - } - - // 기타 에러는 기본 서브서버 에러로 처리 - return Mono.error(new RuntimeException( - "서브 서버 요청 중 오류 발생. 문의 바람 : " + detail - )); - }); - } - - // 정상 응답 - return response.bodyToMono((Class) type.getResponseType()); - }) - .block(); - - } catch (ErrorHandler e) { - throw e; - } catch (Exception e) { - throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); - } - } - - - - - /** - * Query Parameter를 사용하는 POST 요청 - * - * @param type fast api에 보낼 요청을 관리하는 enum - FastApiRequestType - * @param queryParams 쿼리 파라미터 맵 (key-value 쌍) - * @return fast api 로부터 응답받은 데이터 ( R ) - * @param response body의 클래스 - */ - @LogExecutionTime("서브서버 호출 소요시간") - public R sendRequestWithQueryParams(FastApiRequestType type, java.util.Map queryParams) { - R block = null; - try { - block = fastApiWebClient.post() - .uri(uriBuilder -> { - var builder = uriBuilder.path(type.getUri()); - queryParams.forEach((key, value) -> { - if (value != null) { - builder.queryParam(key, value); - } - }); - return builder.build(); - }) - .retrieve() - .bodyToMono((Class) type.getResponseType()) - .block(); - } catch (WebClientResponseException e) { - // 서브서버의 실제 응답 상태 코드와 메시지 로깅 - System.err.println("=== 서브서버 응답 오류 ==="); - System.err.println("URI: " + type.getUri()); - System.err.println("Query Params: " + queryParams); - System.err.println("Status Code: " + e.getStatusCode()); - System.err.println("Response Body: " + e.getResponseBodyAsString()); - System.err.println("Error Message: " + e.getMessage()); - e.printStackTrace(); - throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); - } catch (Exception e) { - // 기타 예외 (네트워크 오류, 타임아웃 등) - System.err.println("=== 서브서버 요청 오류 ==="); - System.err.println("URI: " + type.getUri()); - System.err.println("Query Params: " + queryParams); - System.err.println("Error Type: " + e.getClass().getName()); - System.err.println("Error Message: " + e.getMessage()); - e.printStackTrace(); - throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); - } - - return block; - } - -} diff --git a/src/main/java/DiffLens/back_end/global/fastapi/FastApiRequestType.java b/src/main/java/DiffLens/back_end/global/fastapi/FastApiRequestType.java index 3a329f8..e92a092 100644 --- a/src/main/java/DiffLens/back_end/global/fastapi/FastApiRequestType.java +++ b/src/main/java/DiffLens/back_end/global/fastapi/FastApiRequestType.java @@ -12,28 +12,26 @@ public enum FastApiRequestType { // 검색 - NATURAL_SEARCH("/ai/search", FastNaturalLanguageRequestDTO.NaturalSearch.class, - FastNaturalLanguageResponseDTO.NaturalSearch.class), - NATURAL_SEARCH2("/api/search/", MainSearchRequest.class, - MainSearchResponse.class), - RE_SEARCH("/api/re-search", FastReSearchRequestDTO.ReSearch.class, FastReSearchResponseDTO.ReSearch.class), + NATURAL_SEARCH("/api/search/", MainSearchRequest.class, + MainSearchResponse.class, "자연어 검색"), + RE_SEARCH("/api/re-search", FastReSearchRequestDTO.ReSearch.class, FastReSearchResponseDTO.ReSearch.class, "재검색"), // 추천 RECOMMENDATIONS("/api/quick-search/recommendations", FastHomeRequestDTO.HomeRecommendRequest.class, - FastHomeResponseDTO.HomeRecommend.class), // 일반 추천 + FastHomeResponseDTO.HomeRecommend.class, "검색어 일반 추천"), // 일반 추천 RECOMMENDATIONS_BY_MEMBER("/api/quick-search/recommendations/by-member", FastHomeRequestDTO.HomeRecommendByMemberRequest.class, - FastHomeResponseDTO.HomeRecommend.class), + FastHomeResponseDTO.HomeRecommend.class, "검색어 유저기반 추천"), // 라이브러리 비교 COMPARE("/api/cohort-comparison/compare", Void.class, - FastLibraryCompareResponseDTO.CompareResult.class), + FastLibraryCompareResponseDTO.CompareResult.class, "라이브러리 비교"), // 차트 CHART_RECOMMENDATIONS("/api/chart/search-result/{searchId}/recommendations", Void.class, - FastChartResponseDTO.ChartRecommendationsResponse.class), + FastChartResponseDTO.ChartRecommendationsResponse.class, "차트 추천"), CHART_FROM_LIBRARY("/api/chart/from-library", FastLibraryChartRequestDTO.class, - FastLibraryChartResponseDTO.LibraryChartResponse.class), + FastLibraryChartResponseDTO.LibraryChartResponse.class, "라이브러리 차트 추천"), // REFINE_SEARCH("/search/refine", // FastNaturalSearchResponseDTO.SearchResult.class), ; @@ -41,5 +39,6 @@ public enum FastApiRequestType { private final String uri; private final Class requestBody; // request body private final Class responseType; // response body + private final String name; } diff --git a/src/main/java/DiffLens/back_end/global/fastapi/FastApiService.java b/src/main/java/DiffLens/back_end/global/fastapi/FastApiService.java index 1eea862..fdee1b7 100644 --- a/src/main/java/DiffLens/back_end/global/fastapi/FastApiService.java +++ b/src/main/java/DiffLens/back_end/global/fastapi/FastApiService.java @@ -2,14 +2,17 @@ import DiffLens.back_end.global.fastapi.dto.request.FastHomeRequestDTO; import DiffLens.back_end.global.fastapi.dto.request.FastLibraryChartRequestDTO; -import DiffLens.back_end.global.fastapi.dto.request.FastNaturalLanguageRequestDTO; import DiffLens.back_end.global.fastapi.dto.request.MainSearchRequest; import DiffLens.back_end.global.fastapi.dto.response.FastHomeResponseDTO; import DiffLens.back_end.global.fastapi.dto.response.FastLibraryChartResponseDTO; -import DiffLens.back_end.global.fastapi.dto.response.FastNaturalLanguageResponseDTO; import DiffLens.back_end.global.fastapi.dto.response.FastLibraryCompareResponseDTO; import DiffLens.back_end.global.fastapi.dto.response.MainSearchResponse; import DiffLens.back_end.global.fastapi.dto.response.FastChartResponseDTO; +import DiffLens.back_end.global.fastapi.fastApiClients.PathVariableFastApiClient; +import DiffLens.back_end.global.fastapi.fastApiClients.PostFastApiClient; +import DiffLens.back_end.global.fastapi.fastApiClients.QueryParamFastApiClient; +import DiffLens.back_end.global.responses.code.status.error.SearchStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -20,17 +23,13 @@ @RequiredArgsConstructor public class FastApiService { - private final FastApiClient fastApiClient; + private final PostFastApiClient postClient; + private final PathVariableFastApiClient pathClient; + private final QueryParamFastApiClient queryClient; // 자연어 검색 - public FastNaturalLanguageResponseDTO.NaturalSearch getNaturalSearch( - FastNaturalLanguageRequestDTO.NaturalSearch request) { - return fastApiClient.sendRequest(FastApiRequestType.NATURAL_SEARCH, request); - } - - // 자연어 검색2 public MainSearchResponse getMainSearch(MainSearchRequest request) { - return fastApiClient.sendRequest(FastApiRequestType.NATURAL_SEARCH2, request); + return postClient.sendRequest(FastApiRequestType.NATURAL_SEARCH, request); } // 라이브러리 비교 @@ -38,26 +37,33 @@ public FastLibraryCompareResponseDTO.CompareResult compareLibraries(Long cohort1 java.util.Map queryParams = new java.util.HashMap<>(); queryParams.put("cohort_1_id", cohort1Id); queryParams.put("cohort_2_id", cohort2Id); - return fastApiClient.sendRequestWithQueryParams(FastApiRequestType.COMPARE, queryParams); + return queryClient.sendRequest(FastApiRequestType.COMPARE, null, queryParams); } // 추천검색 public FastHomeResponseDTO.HomeRecommend recommend(FastHomeRequestDTO.HomeRecommendRequest request) { - return fastApiClient.sendRequest(FastApiRequestType.RECOMMENDATIONS, request); + return postClient.sendRequest(FastApiRequestType.RECOMMENDATIONS, request); } // 차트 추천 public FastChartResponseDTO.ChartRecommendationsResponse getChartRecommendations(Long searchId) { - return fastApiClient.sendRequestWithPathVariable( + + FastChartResponseDTO.ChartRecommendationsResponse response = pathClient.sendRequest( FastApiRequestType.CHART_RECOMMENDATIONS, null, searchId); + + // 호출 예외 발생하면 null을 반환함 -> null일 경우 NO_RESULT 반환 + if(response == null) + throw new ErrorHandler(SearchStatus.NO_RESULT); + + return response; } // 라이브러리로부터 차트 생성 public FastLibraryChartResponseDTO.LibraryChartResponse getChartsFromLibrary( FastLibraryChartRequestDTO request) { - return fastApiClient.sendRequest(FastApiRequestType.CHART_FROM_LIBRARY, request); + return postClient.sendRequest(FastApiRequestType.CHART_FROM_LIBRARY, request); } } diff --git a/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastLibraryRequestDTO.java b/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastLibraryRequestDTO.java deleted file mode 100644 index d0d996f..0000000 --- a/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastLibraryRequestDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package DiffLens.back_end.global.fastapi.dto.request; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -/** - * - * 라이브러리 비교 - * Spring Boot -> Fast API 요청 형태 - * - */ -public class FastLibraryRequestDTO { - - @Getter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class LibraryCompare{ - private Long libraryId1; - private Long libraryId2; - } - -} diff --git a/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastNaturalLanguageRequestDTO.java b/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastNaturalLanguageRequestDTO.java deleted file mode 100644 index e55532a..0000000 --- a/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastNaturalLanguageRequestDTO.java +++ /dev/null @@ -1,47 +0,0 @@ -package DiffLens.back_end.global.fastapi.dto.request; - -import lombok.*; - -import java.util.List; - -/** - * - * 자연어 검색 - * Spring Boot -> Fast API 요청 형태 - * - */ -public class FastNaturalLanguageRequestDTO { - - // 자연어 검색 요청 - @Getter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class NaturalSearch { - - private String query; - - private String searchMode; - - private NaturalSearchFilters filters; - - } - - @Getter - @Setter - @NoArgsConstructor - @AllArgsConstructor - public static class NaturalSearchFilters { - - private String respondentCount; - private String gender; - private String ageGroup; - private List region; - private String martialStatus; - private String childrenCount; - private String occupation; - - } - - -} diff --git a/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastPanelRequestDTO.java b/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastPanelRequestDTO.java deleted file mode 100644 index e33fc92..0000000 --- a/src/main/java/DiffLens/back_end/global/fastapi/dto/request/FastPanelRequestDTO.java +++ /dev/null @@ -1,97 +0,0 @@ -package DiffLens.back_end.global.fastapi.dto.request; - -import lombok.*; - -import java.util.List; - -/** - * - * Spring Boot -> Fast API 요청 형태 - * - */ -public class FastPanelRequestDTO { - - // 자연어 검색 요청 - @Getter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class FastNaturalSearch{ - - private String question; - - private String mode; - - private FastSearchFilters filters; - - } - - // 재검색 요청 - @Getter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class FastRefineSearch{ - - private String question; - - private String mode; - - private FastSearchFilters filters; - - - } - - // 차트 - @Getter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class FastChart{ - - private String tempColumn; - - } - - // 추천 - @Getter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class FastRecommendation { - - private String tempColumn; - - } - - // 라이브러리 비교 - @Getter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class FastLibraryCompare { - - private Long libraryId1; - private Long libraryId2; - private List panelIds1; - private List panelIds2; - - } - - // ------------------------------- - // 아 아래는 위에서 필요한 클래스들 - - @Getter - @Setter - @NoArgsConstructor - @AllArgsConstructor - public static class FastSearchFilters{ - - private Integer count; - private String gender; - private List filters; - - } - - -} diff --git a/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/FastApiClient.java b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/FastApiClient.java new file mode 100644 index 0000000..5afb71a --- /dev/null +++ b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/FastApiClient.java @@ -0,0 +1,40 @@ +package DiffLens.back_end.global.fastapi.fastApiClients; + +import DiffLens.back_end.global.fastapi.FastApiRequestType; + +public interface FastApiClient { + + /** + * FastAPI 서버와의 모든 종류의 요청을 하나의 메서드로 처리하기 위한 통합 인터페이스입니다. + * + * 이 메서드는 기존 FastApiClient에서 분리되어 있던 다음 세 가지 요청 방식을 모두 지원합니다: + * + * 1) POST 요청 + RequestBody 전송 + * - 일반적인 FastAPI POST/PUT 요청을 처리합니다. + * - JSON Body를 전송하고, 지정된 타입의 응답을 반환받습니다. + * + * 2) GET 요청 + PathVariable 전달 + * - 경로에 값을 포함하여 요청하는 형태를 처리합니다. + * - 예: /api/item/{id} + * + * 3) GET 요청 + Query Parameter 전달 + * - key=value 형태의 쿼리 파라미터를 전달하는 GET 요청을 처리합니다. + * - 예: /api/items?keyword=abc&page=3 + * + * 위 세 가지 기능을 하나의 sendRequest 메서드로 통합하여, + * 요청 타입(FastApiRequestType)에 따라 적절한 방식으로 FastAPI 서버와 통신합니다. + * + * @param type FastAPI 요청 메타데이터 (URI, HTTP Method, 응답 타입 등) + * @param requestBody POST/PUT 요청 시 전송할 Body (GET 계열에서는 무시) + * @param pathVariables PathVariable 또는 QueryParam 등 요청 시 필요한 추가 매개변수 + * @param 요청 Body 타입 + * @param 응답 Body 타입 + * @return FastAPI 서버로부터 받은 응답 데이터 + */ + R sendRequest( + FastApiRequestType type, + T requestBody, + Object... pathVariables + ); + +} diff --git a/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/PathVariableFastApiClient.java b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/PathVariableFastApiClient.java new file mode 100644 index 0000000..0ced510 --- /dev/null +++ b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/PathVariableFastApiClient.java @@ -0,0 +1,56 @@ +package DiffLens.back_end.global.fastapi.fastApiClients; + +import DiffLens.back_end.global.fastapi.FastApiRequestType; +import DiffLens.back_end.global.fastapi.dto.FastApiErrorDto; +import DiffLens.back_end.global.logger.annotations.SubServerExecutionTime; +import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatusCode; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +/** + * path variable에 대한 FastApiClient + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class PathVariableFastApiClient implements FastApiClient { + + private final WebClient fastApiWebClient; + + @Override + @SubServerExecutionTime("서브서버 호출 소요시간") + public R sendRequest(FastApiRequestType type, T requestBody, Object... pathVariables) { + try { + return fastApiWebClient.get() + .uri(type.getUri(), pathVariables) + .exchangeToMono(response -> { + HttpStatusCode status = response.statusCode(); + + if (status.is4xxClientError() || status.is5xxServerError()) { + return response.bodyToMono(FastApiErrorDto.class) + .flatMap(errorDto -> { + String detail = errorDto.getDetail(); + + log.warn("🐞 [서브서버 호출 예외 발생] errorCode : {}, detail : {}", status.value(), detail); + + return Mono.just(null); + }); + } + + // 정상 응답 + return response.bodyToMono((Class) type.getResponseType()); + }) + .block(); + + } catch (ErrorHandler e) { + throw e; + } catch (Exception e) { + throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); + } + } +} diff --git a/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/PostFastApiClient.java b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/PostFastApiClient.java new file mode 100644 index 0000000..6d11311 --- /dev/null +++ b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/PostFastApiClient.java @@ -0,0 +1,43 @@ +package DiffLens.back_end.global.fastapi.fastApiClients; + +import DiffLens.back_end.global.fastapi.FastApiRequestType; +import DiffLens.back_end.global.logger.annotations.SubServerExecutionTime; +import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PostFastApiClient implements FastApiClient { + + private final WebClient fastApiWebClient; + + @Override + @SubServerExecutionTime("서브서버 호출 소요시간") + public R sendRequest(FastApiRequestType type, T requestBody, Object... ignore) { + + // 요청 타입이 맞지 않을 경우에 대한 예외 + if (!type.getRequestBody().isInstance(requestBody)) { + throw new IllegalArgumentException("올바르지 않은 요청 타입 " + type.name()); // TODO : 에외처리... + } + + R block = null; + try { + block = fastApiWebClient.post() + .uri(type.getUri()) + .bodyValue(requestBody) + .retrieve() + .bodyToMono((Class) type.getResponseType()) + .block(); + } catch (Exception e) { // fast api 호출 중 에러 발생시 예외 발생 + log.warn("[{} 호출 중 예외 발생] {} : ", type.getName(), e.getMessage()); + throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); + } + + return block; + } +} diff --git a/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/QueryParamFastApiClient.java b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/QueryParamFastApiClient.java new file mode 100644 index 0000000..5835e22 --- /dev/null +++ b/src/main/java/DiffLens/back_end/global/fastapi/fastApiClients/QueryParamFastApiClient.java @@ -0,0 +1,74 @@ +package DiffLens.back_end.global.fastapi.fastApiClients; + +import DiffLens.back_end.global.fastapi.FastApiRequestType; +import DiffLens.back_end.global.logger.annotations.SubServerExecutionTime; +import DiffLens.back_end.global.responses.code.status.error.ErrorStatus; +import DiffLens.back_end.global.responses.exception.handler.ErrorHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; + +import java.util.Map; + +/** + * Query Parameter에 대한 FastApiService + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class QueryParamFastApiClient implements FastApiClient { + + private final WebClient fastApiWebClient; + + @Override + @SubServerExecutionTime("서브서버 호출 소요시간") + public R sendRequest(FastApiRequestType type, T requestBody, Object... params) { + + Map queryParams = (Map) params[0]; + + try { + return fastApiWebClient.post() + .uri(uriBuilder -> { + var builder = uriBuilder.path(type.getUri()); + queryParams.forEach((key, value) -> { + if (value != null) { + builder.queryParam(key, value); + } + }); + return builder.build(); + }) + .retrieve() + .bodyToMono((Class) type.getResponseType()) + .block(); + + } catch (WebClientResponseException e) { + + StringBuilder sb = new StringBuilder(); + sb.append("\n=== 서브서버 응답 오류 ===\n") + .append("URI: ").append(type.getUri()).append("\n") + .append("Query Params: ").append(queryParams).append("\n") + .append("Status Code: ").append(e.getStatusCode()).append("\n") + .append("Response Body: ").append(e.getResponseBodyAsString()).append("\n") + .append("Error Message: ").append(e.getMessage()).append("\n"); + + log.error(sb.toString(), e); + + throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); + + } catch (Exception e) { + + StringBuilder sb = new StringBuilder(); + sb.append("\n=== 서브서버 요청 오류 ===\n") + .append("URI: ").append(type.getUri()).append("\n") + .append("Query Params: ").append(queryParams).append("\n") + .append("Error Type: ").append(e.getClass().getName()).append("\n") + .append("Error Message: ").append(e.getMessage()).append("\n"); + + log.error(sb.toString(), e); + + throw new ErrorHandler(ErrorStatus.SUB_SERVER_ERROR); + } + } +} diff --git a/src/main/java/DiffLens/back_end/global/aop/annotations/LogExecutionTime.java b/src/main/java/DiffLens/back_end/global/logger/annotations/SubServerExecutionTime.java similarity index 63% rename from src/main/java/DiffLens/back_end/global/aop/annotations/LogExecutionTime.java rename to src/main/java/DiffLens/back_end/global/logger/annotations/SubServerExecutionTime.java index c11c2d1..368d3e0 100644 --- a/src/main/java/DiffLens/back_end/global/aop/annotations/LogExecutionTime.java +++ b/src/main/java/DiffLens/back_end/global/logger/annotations/SubServerExecutionTime.java @@ -1,10 +1,10 @@ -package DiffLens.back_end.global.aop.annotations; +package DiffLens.back_end.global.logger.annotations; import java.lang.annotation.*; @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented -public @interface LogExecutionTime { +public @interface SubServerExecutionTime { String value() default "메서드 실행 시간"; } diff --git a/src/main/java/DiffLens/back_end/global/aop/ApiRequestLogAspect.java b/src/main/java/DiffLens/back_end/global/logger/aop/ApiRequestLogAspect.java similarity index 69% rename from src/main/java/DiffLens/back_end/global/aop/ApiRequestLogAspect.java rename to src/main/java/DiffLens/back_end/global/logger/aop/ApiRequestLogAspect.java index a9283f7..3540f6d 100644 --- a/src/main/java/DiffLens/back_end/global/aop/ApiRequestLogAspect.java +++ b/src/main/java/DiffLens/back_end/global/logger/aop/ApiRequestLogAspect.java @@ -1,8 +1,9 @@ -package DiffLens.back_end.global.aop; +package DiffLens.back_end.global.logger.aop; import DiffLens.back_end.domain.members.entity.Member; import DiffLens.back_end.domain.members.service.auth.CurrentUserService; -import DiffLens.back_end.global.aop.annotations.LogExecutionTime; +import DiffLens.back_end.global.fastapi.FastApiRequestType; +import DiffLens.back_end.global.logger.annotations.SubServerExecutionTime; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,6 +15,8 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import java.lang.reflect.Method; + @Aspect @Component @Slf4j @@ -27,7 +30,7 @@ public class ApiRequestLogAspect { * CommonPointcut.restControllerEndpoints() Pointcut 지정하여 * API 호출 시 호출 전후로 로그 출력하도록 하는 Aspect */ - @Around("CommonPointCut.restControllerEndpoints()") + @Around("DiffLens.back_end.global.logger.aop.CommonPointCut.restControllerEndpoints()") public Object logApiRequest(ProceedingJoinPoint jp) throws Throwable { long start = System.currentTimeMillis(); @@ -60,26 +63,43 @@ public Object logApiRequest(ProceedingJoinPoint jp) throws Throwable { } } - @Around("CommonPointCut.methodRuntimeEndpoints()") - public Object logExecutionTime(ProceedingJoinPoint jp) throws Throwable { + @Around("DiffLens.back_end.global.logger.aop.CommonPointCut.methodRuntimeEndpoints()") + public Object subServerExecutionTime(ProceedingJoinPoint jp) throws Throwable { long start = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) jp.getSignature(); - String methodName = signature.toShortString(); + Method method = signature.getMethod(); - // 어노테이션 가져오기 - LogExecutionTime annotation = signature.getMethod().getAnnotation(LogExecutionTime.class); + SubServerExecutionTime annotation = method.getAnnotation(SubServerExecutionTime.class); String label = annotation.value(); + // === FastApiRequestType 찾아오기 === + FastApiRequestType apiType = null; + for (Object arg : jp.getArgs()) { + if (arg instanceof FastApiRequestType) { + apiType = (FastApiRequestType) arg; + break; + } + } + + // label 확장 + if (apiType != null) + label = label + " - " + apiType.getName(); // ← 자동 확장 + try { Object result = jp.proceed(); long end = System.currentTimeMillis(); - log.info("⏱️ [{}] {}: {}ms", label, methodName, (end - start)); + log.info("⏱️ [{}] {}: {}ms", label, signature.toShortString(), (end - start)); return result; } catch (Throwable ex) { long end = System.currentTimeMillis(); - log.error("💥 [{}] {} ({}ms) - {}", label, methodName, (end - start), ex.getMessage()); + log.error("💥 [{}] {} ({}ms) - {}", + label, + signature.toShortString(), + (end - start), + ex.getMessage()); throw ex; } } + } \ No newline at end of file diff --git a/src/main/java/DiffLens/back_end/global/aop/CommonPointCut.java b/src/main/java/DiffLens/back_end/global/logger/aop/CommonPointCut.java similarity index 70% rename from src/main/java/DiffLens/back_end/global/aop/CommonPointCut.java rename to src/main/java/DiffLens/back_end/global/logger/aop/CommonPointCut.java index 1be492c..be05150 100644 --- a/src/main/java/DiffLens/back_end/global/aop/CommonPointCut.java +++ b/src/main/java/DiffLens/back_end/global/logger/aop/CommonPointCut.java @@ -1,4 +1,4 @@ -package DiffLens.back_end.global.aop; +package DiffLens.back_end.global.logger.aop; import org.aspectj.lang.annotation.Pointcut; @@ -8,7 +8,7 @@ public class CommonPointCut { @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)") public void restControllerEndpoints() {} - @Pointcut("@annotation(DiffLens.back_end.global.aop.annotations.LogExecutionTime)") + @Pointcut("@annotation(DiffLens.back_end.global.logger.annotations.SubServerExecutionTime)") public void methodRuntimeEndpoints() {} } diff --git a/src/main/java/DiffLens/back_end/global/redis/CacheInfo.java b/src/main/java/DiffLens/back_end/global/redis/CacheInfo.java new file mode 100644 index 0000000..e8a5a5d --- /dev/null +++ b/src/main/java/DiffLens/back_end/global/redis/CacheInfo.java @@ -0,0 +1,21 @@ +package DiffLens.back_end.global.redis; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.concurrent.TimeUnit; + +@AllArgsConstructor +@Getter +public enum CacheInfo { + + Search_Recommendation("search:recommend:", 10, TimeUnit.MINUTES), + + Library_Compare("library:compare:", 20, TimeUnit.MINUTES), + ; + + private String prefix; + private int TTL; + private TimeUnit timeUnit; + +} diff --git a/src/main/java/DiffLens/back_end/global/redis/CacheService.java b/src/main/java/DiffLens/back_end/global/redis/CacheService.java index 3d44f50..a72d822 100644 --- a/src/main/java/DiffLens/back_end/global/redis/CacheService.java +++ b/src/main/java/DiffLens/back_end/global/redis/CacheService.java @@ -13,5 +13,4 @@ public interface CacheService { void saveCacheInfo(R data, T cacheInfo); - } diff --git a/src/main/java/DiffLens/back_end/global/redis/RedisCacheRepository.java b/src/main/java/DiffLens/back_end/global/redis/RedisCacheRepository.java new file mode 100644 index 0000000..ac7dfc2 --- /dev/null +++ b/src/main/java/DiffLens/back_end/global/redis/RedisCacheRepository.java @@ -0,0 +1,19 @@ +package DiffLens.back_end.global.redis; + +import java.util.function.Supplier; + +public interface RedisCacheRepository { + + // 저장 + boolean save(String key, Object value, CacheInfo cacheInfo); + + // 조회 + T findByKey(String key); + + // 조회했는데 없을 시 + T findOrElse(String key, Supplier supplier, CacheInfo cacheInfo); + + // 삭제 + boolean delete(String key); + +} diff --git a/src/test/java/DiffLens/back_end/ApplicationTests.java b/src/test/java/DiffLens/back_end/ApplicationTests.java index 5827e17..41552a5 100644 --- a/src/test/java/DiffLens/back_end/ApplicationTests.java +++ b/src/test/java/DiffLens/back_end/ApplicationTests.java @@ -10,4 +10,4 @@ class ApplicationTests { void contextLoads() { } -} +} \ No newline at end of file