@Bean
public SpringLiquibase liquibase(ObjectProvider<DataSource> dataSource,
@LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource, LiquibaseProperties properties,
LiquibaseConnectionDetails connectionDetails) {...}
我发现冲突的豆类是液体的类型。我了解问题之所以发生问题,是因为我的应用程序是使用Docker组成的文件启动的,该文件不仅运行了应用程序,而且还启动了KeyCloak和两个数据库。这导致自动配置检测两个数据源。就我而言,我希望Liquibase仅连接到应用程序的数据源,而不是KeyCloak’s。我的应用程序中的配置是properties文件:
spring.datasource.url=${SERVER_DB_URL}/${SERVER_DB}
spring.datasource.username=${SERVER_DB_USER}
spring.datasource.password=${SERVER_DB_PASSWORD}
spring.datasource.driver-class-name=org.postgresql.Driver
spring.liquibase.url=${SERVER_DB_URL}/${SERVER_DB}
spring.liquibase.user=${SERVER_DB_USER}
spring.liquibase.password=${SERVER_DB_PASSWORD}
spring.liquibase.change-log=classpath:db/changelogs/changelog-master.xml
显然,KeyCloak DB URL与众不同:JDBC:Postgresql:// localhost:5433.
我还添加了我的作曲,以防万一它可以帮助:
services:
keycloak_db:
image: postgres
container_name: keycloak_db
restart: always
ports:
- "${KEYCLOAK_DB_PORT}:5432"
environment:
POSTGRES_DB: ${KEYCLOAK_DB}
POSTGRES_USER: ${KEYCLOAK_DB_USER}
POSTGRES_PASSWORD: ${KEYCLOAK_DB_PASSWORD}
volumes:
- keycloak-db-volume:/var/lib/postgresql/data
keycloak:
image: keycloak/keycloak
container_name: keycloak
restart: always
command:
- start-dev
ports:
- "${KEYCLOAK_PORT}:8080"
environment:
KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN}
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://keycloak_db/${KEYCLOAK_DB}
KC_DB_USERNAME: ${KEYCLOAK_DB_USER}
KC_DB_PASSWORD: ${KEYCLOAK_DB_PASSWORD}
depends_on:
- keycloak_db
volumes:
- keycloak-volume:/opt/keycloak/data/import/
postgres:
image: postgres
container_name: server_db
restart: always
ports:
- "${SERVER_DB_PORT}:5432"
environment:
POSTGRES_DB: ${SERVER_DB}
POSTGRES_USER: ${SERVER_DB_USER}
POSTGRES_PASSWORD: ${SERVER_DB_PASSWORD}
depends_on:
- keycloak
volumes:
- server_db_volume:/var/lib/postgresql/data
,我该如何定义要使用的特定豆?我已经看过一个曾经使用@primary的示例,但没有液体问题确切地出现问题,因此它不起作用。同样,豆的定义位置是“未知”的事实,也使其更加复杂。
尽管起初我希望它只是忽略了KeyCloak的那些,但我知道将来有一种允许两者的方式可能很有用,但是我的首要任务是仅与第一个竞选。
通过运行一些测试,我发现,尽管我尝试在应用程序中指定数据源。我可以证明,尽管只有通过反复试验,但这是由于以下插件所致:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
</dependency>
当我使用Intellij运行我的应用程序时,该组合也被执行了,我发现它很棒,但是容器和应用程序之间的“自动配置”使其完全检测了新数据源而不需要它。
尽管我可以使它起作用,但至少目前,我仍然认为我缺乏一种方法,如果我再次添加插件,请抑制spring autoconfiguration for dataSources并实现我自己的。