Spring Boot で Enum を case insensitive (ignore case) でパースする方法
spring の既定では文字列を enum に変換する際、case sensitive です。
case insensitive にする方法を解説します。
ConversionService と Converter
文字列を enum に変換する独自の Converter を ConversionService に組み込むことで、
spring の既定の動作を変更することができます。
文字列から単純な enum Sex
に変換します:
Sex.java
public enum Sex {
Male,
Female
}
ConversionService と Converter とを提供する @Configuration
クラス:
ApplicationConfiguration.java
@Configuration
public class ApplicationConfiguration {
@Bean
public ConversionService conversionService() {
DefaultConversionService conversionService = new DefaultConversionService();
conversionService.addConverter(new Converter<String, Sex>() {
public Sex convert(String source) {
for (Sex sex : Sex.values()) {
if (source.equalsIgnoreCase(sex.toString())) {
return sex;
}
}
throw new IllegalArgumentException("invalid sex: " + source);
}
});
return conversionService;
}
}
テスト
ApplicationProgram
@EnableAutoConfiguration
@EnableConfigurationProperties
@ComponentScan
public class ApplicationProgram {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(ApplicationProgram.class, args);
Runtime.getRuntime().exit(SpringApplication.exit(ctx));
}
}
ApplicationOptions
@Component
@ConfigurationProperties
public class ApplicationOptions {
private Sex sex;
public Sex getSex() {
return this.sex;
}
public void setSex(Sex sex) {
this.sex = sex;
}
@PostConstruct
public void init() {
System.out.println("sex=" + this.getSex());
}
}
ApplicationProgramTest
public class ApplicationProgramTest {
@Test
public void testMain() {
ApplicationProgram.main(new String[] { "--sex=male" });
}
}
コンソールに sex=Mail
と出力されます。
以上。