Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion jdbc-hikari/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ dependencies {

compileOnly(mnMicrometer.micronaut.micrometer.core)

testRuntimeOnly(libs.managed.tomcat.jdbc)
testRuntimeOnly(libs.managed.h2)

testAnnotationProcessor(mn.micronaut.inject.java)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.micronaut.configuration.jdbc.hikari.custom

import io.micronaut.configuration.jdbc.hikari.DatasourceConfiguration
import io.micronaut.context.ApplicationContext
import io.micronaut.context.DefaultApplicationContext
import io.micronaut.context.env.MapPropertySource
import io.micronaut.jdbc.DataSourceResolver
import spock.lang.Specification

import javax.sql.DataSource

class CustomDatasourceConfigurationSpec extends Specification {

void "test default configuration and password change"() {
given:
ApplicationContext applicationContext = new DefaultApplicationContext("test")
System.setProperty("ds-default-password", "")
applicationContext.environment.addPropertySource(MapPropertySource.of(
'test',
['datasources.default.password' : '${ds-default-password}',
'datasources.default.dialect' : 'H2',
'datasources.default.url' : 'jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE',
'datasources.default.username' : 'sa',
'datasources.default.driver-class-name' : 'org.h2.Driver',
'datasources.default.connection-test-query': 'SELECT 1',
'use-custom-factory' : 'true']
))
applicationContext.start()
DataSourceResolver dataSourceResolver = applicationContext.findBean(DataSourceResolver).orElse(DataSourceResolver.DEFAULT)

expect:
applicationContext.containsBean(DataSource)
applicationContext.containsBean(DatasourceConfiguration)

when:
def dataSource = dataSourceResolver.resolve(applicationContext.getBean(DataSource))

then:
dataSource instanceof CustomDataSource
Copy link
Contributor Author

@radovanradic radovanradic Jul 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test in jdbc-hikari module passes. Only when testAnnotationProcessor(mn.micronaut.inject.java) is removed it fails like in the hikari-h2-tests module


cleanup:
applicationContext.close()
}




}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.micronaut.configuration.jdbc.hikari.custom;

import com.zaxxer.hikari.HikariConfig;
import io.micronaut.configuration.jdbc.hikari.HikariUrlDataSource;


public class CustomDataSource extends HikariUrlDataSource {

public CustomDataSource(HikariConfig configuration) {
super(configuration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.micronaut.configuration.jdbc.hikari.custom;

import io.micronaut.configuration.jdbc.hikari.DatasourceConfiguration;
import io.micronaut.configuration.jdbc.hikari.DatasourceFactory;
import io.micronaut.context.ApplicationContext;
import io.micronaut.context.annotation.Context;
import io.micronaut.context.annotation.EachBean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.annotation.Replaces;
import io.micronaut.context.annotation.Requires;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.sql.DataSource;

@Factory
@Replaces(factory = DatasourceFactory.class)
@Requires(property = "use-custom-factory", value = "true")
class CustomDataSourceFactory extends DatasourceFactory {
private static final Logger LOG = LoggerFactory.getLogger(CustomDataSourceFactory.class);

CustomDataSourceFactory(ApplicationContext applicationContext) {
super(applicationContext);
LOG.info("CustomDataSourceFactory created");
}

@Override
@Context
@EachBean(DatasourceConfiguration.class)
public DataSource dataSource(DatasourceConfiguration datasourceConfiguration) {
LOG.info("Creating CustomDataSource");
return new CustomDataSource(datasourceConfiguration);
}
}
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,5 @@ include 'tests:jooq-tests:jooq-r2dbc-postgres'

include 'tests:jdbc-ucp-tests:jdbc-ucp-oracle'
include 'tests:jdbc-dbcp-tests:jdbc-dbcp-postgres'
include 'tests:jdbc-hikari-tests:jdbc-hikari-h2'
include 'tests:jdbc-tomcat-tests:jdbc-tomcat-mysql'
9 changes: 9 additions & 0 deletions tests/jdbc-hikari-tests/jdbc-hikari-h2/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
plugins {
id 'io.micronaut.build.internal.test-application'
}

dependencies {
implementation projects.micronautJdbcHikari
runtimeOnly libs.managed.h2
testImplementation projects.micronautTests.micronautCommonTests
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package example.jdbc.hikari.sync;

import io.micronaut.configuration.jdbc.hikari.DatasourceConfiguration;
import io.micronaut.configuration.jdbc.hikari.DatasourceFactory;
import io.micronaut.context.ApplicationContext;
import io.micronaut.context.annotation.Context;
import io.micronaut.context.annotation.EachBean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.annotation.Primary;
import io.micronaut.context.annotation.Replaces;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.sql.DataSource;

@Factory
@Replaces(factory = DatasourceFactory.class, bean = DatasourceFactory.class)
@Primary
public class CustomDataSourceFactory extends DatasourceFactory {

private static final Logger LOG = LoggerFactory.getLogger(CustomDataSourceFactory.class);

public CustomDataSourceFactory(ApplicationContext applicationContext) {
super(applicationContext);
LOG.info("CustomDataSourceFactory created");
}

@Override
@Context
@EachBean(DatasourceConfiguration.class)
public DataSource dataSource(DatasourceConfiguration datasourceConfiguration) {
LOG.info("Created custom datasource");
return new CustomHikariUrlDataSource(datasourceConfiguration);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package example.jdbc.hikari.sync;

import com.zaxxer.hikari.HikariConfig;
import io.micronaut.configuration.jdbc.hikari.HikariUrlDataSource;

public class CustomHikariUrlDataSource extends HikariUrlDataSource {
public CustomHikariUrlDataSource(HikariConfig configuration) {
super(configuration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package example.jdbc.hikari.sync;

import io.micronaut.configuration.jdbc.hikari.DatasourceConfiguration;
import io.micronaut.context.ApplicationContext;
import io.micronaut.context.DefaultApplicationContext;
import io.micronaut.jdbc.DataSourceResolver;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import javax.sql.DataSource;

class CustomDataSourceFactoryTest {

@Test
void testUseCustomFactory() {
ApplicationContext applicationContext = new DefaultApplicationContext("test");
applicationContext.start();
DataSourceResolver dataSourceResolver = applicationContext.findBean(DataSourceResolver.class).orElse(DataSourceResolver.DEFAULT);
Assertions.assertTrue(applicationContext.containsBean(DataSource.class));
Assertions.assertTrue(applicationContext.containsBean(DatasourceConfiguration.class));

DataSource dataSource = dataSourceResolver.resolve(applicationContext.getBean(DataSource.class));
Assertions.assertTrue(dataSource instanceof CustomHikariUrlDataSource);

Check failure on line 23 in tests/jdbc-hikari-tests/jdbc-hikari-h2/src/test/java/example/jdbc/hikari/sync/CustomDataSourceFactoryTest.java

View workflow job for this annotation

GitHub Actions / Java CI / Test Report (21)

CustomDataSourceFactoryTest.testUseCustomFactory()

org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
Raw output
org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
	at app//org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
	at app//org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
	at app//org.junit.jupiter.api.AssertTrue.failNotTrue(AssertTrue.java:63)
	at app//org.junit.jupiter.api.AssertTrue.assertTrue(AssertTrue.java:36)
	at app//org.junit.jupiter.api.AssertTrue.assertTrue(AssertTrue.java:31)
	at app//org.junit.jupiter.api.Assertions.assertTrue(Assertions.java:183)
	at app//example.jdbc.hikari.sync.CustomDataSourceFactoryTest.testUseCustomFactory(CustomDataSourceFactoryTest.java:23)
	at java.base@21.0.8/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base@21.0.8/java.util.ArrayList.forEach(ArrayList.java:1596)
	at java.base@21.0.8/java.util.ArrayList.forEach(ArrayList.java:1596)

Check failure on line 23 in tests/jdbc-hikari-tests/jdbc-hikari-h2/src/test/java/example/jdbc/hikari/sync/CustomDataSourceFactoryTest.java

View workflow job for this annotation

GitHub Actions / Java CI / Test Report (17)

CustomDataSourceFactoryTest.testUseCustomFactory()

org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
Raw output
org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
	at app//org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
	at app//org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
	at app//org.junit.jupiter.api.AssertTrue.failNotTrue(AssertTrue.java:63)
	at app//org.junit.jupiter.api.AssertTrue.assertTrue(AssertTrue.java:36)
	at app//org.junit.jupiter.api.AssertTrue.assertTrue(AssertTrue.java:31)
	at app//org.junit.jupiter.api.Assertions.assertTrue(Assertions.java:183)
	at app//example.jdbc.hikari.sync.CustomDataSourceFactoryTest.testUseCustomFactory(CustomDataSourceFactoryTest.java:23)
	at java.base@17.0.12/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base@17.0.12/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base@17.0.12/java.util.ArrayList.forEach(ArrayList.java:1511)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fails unlike groovy test in jdbc-hikari module.

applicationContext.stop();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
datasources.default.password=
datasources.default.dialect=H2
micronaut.application.name=hikari-tests
datasources.default.schema-generate=CREATE_DROP
datasources.default.url=jdbc\:h2\:mem\:devDb;LOCK_TIMEOUT\=10000;DB_CLOSE_ON_EXIT\=FALSE
datasources.default.username=sa
datasources.default.driver-class-name=org.h2.Driver
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<configuration>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>

<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Loading