asyncer-io / r2dbc-mysql

Reactive Relational Database Connectivity for MySQL. The official successor to mirromutth/r2dbc-mysql(dev.miku:r2dbc-mysql).
https://r2dbc.io
Apache License 2.0
195 stars 21 forks source link

Unable to load ApplicationContext after upgrading to asyncer #131

Closed guanyou-git closed 1 year ago

guanyou-git commented 1 year ago

Summary

Am unable to run tests and get the following error, more information here: https://stackoverflow.com/questions/76684680/upgraded-from-miku-to-asyncer-r2dbc-facing-autoconfigure-error-when-compiling

Detailed description

In my test, I have @SpringBootTest @AutoConfigureTestDatabase, and am getting the following error

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.r2dbc.core.DatabaseClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

I updated my maven pom.xml, and updated my ConnectionFactory to the asyncer programmatic implementation

Old

@Configuration
@EnableR2dbcRepositories
public class MySqlConnectionFactories extends AbstractR2dbcConfiguration {

  @Value("${spring.datasource.host}")
  public String host;

  @Value("${spring.datasource.db}")
  public String db;

  @Value("${spring.datasource.username}")
  public String userName;

  @Value("${spring.datasource.password}")
  public String password;

  @Override
  @Bean
  public ConnectionFactory connectionFactory() {
    return MySqlConnectionFactory.from(
      MySqlConnectionConfiguration.builder()
        .host(host)
        .database(db)
        .username(userName)
        .password(password)
        .sslMode(SslMode.VERIFY_IDENTITY)
        .tlsVersion(TlsVersions.TLS1_2)
        .port(3306)
        .tcpKeepAlive(true)
        .tcpNoDelay(true)
        .build());
  }
}

New

@Configuration
@EnableR2dbcRepositories
public class MySqlConnectionFactories extends AbstractR2dbcConfiguration {

  @Value("${spring.datasource.host}")
  public String host;

  @Value("${spring.datasource.db}")
  public String db;

  @Value("${spring.datasource.username}")
  public String userName;

  @Value("${spring.datasource.password}")
  public String password;

  @Override
  @Bean
  public ConnectionFactory connectionFactory() {
    ConnectionFactoryOptions options = ConnectionFactoryOptions.builder()
        .option(ConnectionFactoryOptions.DRIVER, "mysql")
        .option(ConnectionFactoryOptions.HOST, host)
        .option(ConnectionFactoryOptions.USER, userName)
        .option(ConnectionFactoryOptions.PORT, 3306)
        .option(ConnectionFactoryOptions.PASSWORD, password)
        .option(ConnectionFactoryOptions.DATABASE, db)
        .option(Option.valueOf("sslMode"), SslMode.VERIFY_IDENTITY)
        .option(Option.valueOf("tlsVersion"), TlsVersions.TLS1_2)
        .option(Option.valueOf("tcpKeepAlive"), true) // optional, default false
        .option(Option.valueOf("tcpNoDelay"), true) // optional, default false
        .build();
    return ConnectionFactories.get(options);
  }
}

Relevant context

Checklist

jchrys commented 1 year ago

Hello, @guanyou-git. Thanks for reaching us!

Could you provide your debugging logs or minimal reproducer(with git repository will be great)? Since I couldn't reproduce this issue with minimal setup. (https://github.com/jchrys/r2dbc-mysql-issue131 please check MySqlConnectionFactoriesTest)

guanyou-git commented 1 year ago

I have used your repo and added more info here to replicate the issue, appreciate the help, couldn't push into your repo

2023-07-14 17:17:07.326 WARN 65005 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'r2dbcEntityTemplate' defined in class path resource [com/example/issue131reproducer/MySqlConnectionFactories.class]: Unsatisfied dependency expressed through method 'r2dbcEntityTemplate' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.r2dbc.core.DatabaseClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

I know there's a mixed of new and old depedencies which other components of the application require, would appreciate if you have any suggestion on this

jchrys commented 1 year ago

Hi, @guanyou-git. Thank you for sharing the reproducer. It appears that there is an issue with the programmatic R2DBC configuration when using R2dbcDataAutoConfiguration and R2dbcAutoConfiguration. In my environment, I was able to resolve it by disabling both configurations.

I suggest you also report this issue to the springframework community, as it is related to Spring. (I suspect that it might be related to the issue reported at https://github.com/spring-projects/spring-boot/issues/21586)

below is my patch to your reproducer.

@SpringBootApplication(exclude = {
        R2dbcDataAutoConfiguration.class,
        R2dbcAutoConfiguration.class,
        AzureServiceBusQueueAutoConfiguration.class, // I disabled below bc I didn't configure it.
        AzureServiceBusAutoConfiguration.class,
        AzureServiceBusTopicAutoConfiguration.class,
        EmbeddedMongoAutoConfiguration.class,
})
public class Issue131reproducerApplication {

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

}
guanyou-git commented 1 year ago

hi @jchrys , thanks and appreciate the inputs, will feedback accordingly. sorry I missed out on replying last friday.