Skip to content
This repository was archived by the owner on Jan 31, 2022. It is now read-only.
This repository was archived by the owner on Jan 31, 2022. It is now read-only.

Cannot bind configuration properties to MybatisProperties #13

Description

@kazuki43zoo

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);
    };
  }
}

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghelp wantedExtra attention is needed

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions