Cannot bind configuration properties to MybatisProperties, if mapper was scanned (can bind, if mapper not scanned).
I add configuration property of mybatis-spring-boot as follows:
e.g.)
mybatis.configuration.map-underscore-to-camel-case=true
The MybatisPropertyies#getConfiguration() return null when running on native-image.
reproduce project
@Mapper
public interface CityMapper {
@Insert("INSERT INTO city (name, state, country_name) VALUES(#{name}, #{state}, #{countryName})")
@Options(useGeneratedKeys = true, keyProperty = "id")
void insert(City city);
@Select("SELECT id, name, state, country_name FROM city ORDER BY id")
Collection<City> findAll();
}
@Bean
ApplicationRunner runner(CityMapper mapper) {
return args -> {
City newCity = new City();
newCity.setName("NYC");
newCity.setState("NY");
newCity.setCountryName("USA");
mapper.insert(newCity);
log.info("New city: {}", newCity);
mapper.findAll().forEach(x -> log.info("{}", x)); // countryName should set non-null value, but set null
};
}
@Bean
ConfigurationCustomizer configurationCustomizer(MybatisProperties mybatisProperties) {
return c -> {
// Should return not null, but return null
log.info("configuration on auto-configuration time : {}", mybatisProperties.getConfiguration());
// Should return true, but return false
log.info("isMapUnderscoreToCamelCase on auto-configuration time : {}", c.isMapUnderscoreToCamelCase());
};
}
How to reproduce
Build
./mvnw -pl mybatis-spring-native-core,mybatis-spring-native-samples/mybatis-spring-native-sample-config -Pnative clean package -U
Run with native-image(Actual Result)
./mybatis-spring-native-samples/mybatis-spring-native-sample-config/target/mybatis-spring-native-sample-config
...
★★★2022-01-08 15:51:33.647 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : configuration on configuration time : null ★★★ Should return not null
★★★2022-01-08 15:51:33.647 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : isMapUnderscoreToCamelCase on configuration time : false ★★★ Should return true
2022-01-08 15:51:33.655 INFO 92950 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-01-08 15:51:33.657 INFO 92950 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2022-01-08 15:51:33.661 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : Started MybatisSpringNativeSampleApplication in 0.034 seconds (JVM running for 0.036)
2022-01-08 15:51:33.661 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : New city: City{id=4, name='NYC', state='NY', countryName='USA'}
★★★2022-01-08 15:51:33.661 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=1, name='San Francisco', state='CA', countryName='null'} ★★★ countryName should return not null
2022-01-08 15:51:33.661 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=2, name='Boston', state='MA', countryName='null'}
2022-01-08 15:51:33.661 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=3, name='Portland', state='OR', countryName='null'}
2022-01-08 15:51:33.661 INFO 92950 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=4, name='NYC', state='NY', countryName='null'}
...
Run with executable jar(Expected Result)
./mybatis-spring-native-samples/mybatis-spring-native-sample-config/target/mybatis-spring-native-sample-config-0.0.1-SNAPSHOT-exec.jar
...
★★★2022-01-08 15:55:36.296 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : configuration on configuration time : org.apache.ibatis.session.Configuration@6cce16f4
★★★2022-01-08 15:55:36.297 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : isMapUnderscoreToCamelCase on configuration time : true
2022-01-08 15:55:36.408 INFO 92975 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-01-08 15:55:36.624 INFO 92975 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2022-01-08 15:55:36.752 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : Started MybatisSpringNativeSampleApplication in 1.515 seconds (JVM running for 1.901)
2022-01-08 15:55:36.798 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : New city: City{id=4, name='NYC', state='NY', countryName='USA'}
★★★2022-01-08 15:55:36.828 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=1, name='San Francisco', state='CA', countryName='USA'}
2022-01-08 15:55:36.828 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=2, name='Boston', state='MA', countryName='USA'}
2022-01-08 15:55:36.828 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=3, name='Portland', state='OR', countryName='USA'}
2022-01-08 15:55:36.828 INFO 92975 --- [ main] s.c.MybatisSpringNativeSampleApplication : City{id=4, name='NYC', state='NY', countryName='USA'}
...
Workaround
Can use the programmatic based configuration as follows:
@SpringBootApplication
public class MybatisSpringNativeSampleApplication {
// ...
@Bean
ConfigurationCustomizer mybatisConfigurationCustomizer() { // Add bean definition for ConfigurationCustomizer
return configuration -> {
configuration.setMapUnderscoreToCamelCase(true);
};
}
}
Cannot bind configuration properties to
MybatisProperties, if mapper was scanned (can bind, if mapper not scanned).I add configuration property of mybatis-spring-boot as follows:
e.g.)
mybatis.configuration.map-underscore-to-camel-case=trueThe
MybatisPropertyies#getConfiguration()returnnullwhen running on native-image.reproduce project
How to reproduce
Build
Run with native-image(Actual Result)
Run with executable jar(Expected Result)
Workaround
Can use the programmatic based configuration as follows: