Support for simple numeric Flyway version

While Flyway's `MigrationVersion` is a String value, a simple "0" is
also a valid number. When such value is not wrapped in YAML, an integer
is injected rather than a String which leads to a failure as we can't
convert it.

This commit updates the `StringToMigrationVersionConverter` to also
supports conversion from a Number. This is a convenience for users
using YAML for configuration

Closes gh-4981
pull/4984/merge
Stephane Nicoll 9 years ago
parent c23af8f54e
commit ea8e0cfc48

@ -1,5 +1,5 @@
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,10 +16,15 @@
package org.springframework.boot.autoconfigure.flyway;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.apache.commons.lang.ObjectUtils;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationVersion;
@ -38,7 +43,8 @@ import org.springframework.boot.context.properties.ConfigurationPropertiesBindin
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.GenericConverter;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
@ -63,8 +69,8 @@ public class FlywayAutoConfiguration {
@Bean
@ConfigurationPropertiesBinding
public StringToMigrationVersionConverter stringToMigrationVersionConverter() {
return new StringToMigrationVersionConverter();
public StringOrNumberToMigrationVersionConverter stringOrNumberMigrationVersionConverter() {
return new StringOrNumberToMigrationVersionConverter();
}
@Configuration
@ -169,14 +175,29 @@ public class FlywayAutoConfiguration {
}
/**
* Convert a String to a {@link MigrationVersion}.
* Convert a String or Number to a {@link MigrationVersion}.
*/
private static class StringToMigrationVersionConverter
implements Converter<String, MigrationVersion> {
private static class StringOrNumberToMigrationVersionConverter
implements GenericConverter {
private static final Set<ConvertiblePair> CONVERTIBLE_PAIRS = createConvertiblePairs();
@Override
public MigrationVersion convert(String source) {
return MigrationVersion.fromVersion(source);
public Set<ConvertiblePair> getConvertibleTypes() {
return CONVERTIBLE_PAIRS;
}
@Override
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
String value = ObjectUtils.toString(source);
return MigrationVersion.fromVersion(value);
}
private static Set<ConvertiblePair> createConvertiblePairs() {
Set<ConvertiblePair> convertiblePairs = new HashSet<ConvertiblePair>(2);
convertiblePairs.add(new ConvertiblePair(String.class, MigrationVersion.class));
convertiblePairs.add(new ConvertiblePair(Number.class, MigrationVersion.class));
return Collections.unmodifiableSet(convertiblePairs);
}
}

@ -1,5 +1,5 @@
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.flyway;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@ -42,6 +43,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.env.MapPropertySource;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.stereotype.Component;
@ -198,7 +200,7 @@ public class FlywayAutoConfigurationTests {
}
@Test
public void overrideBaselineVersion() throws Exception {
public void overrideBaselineVersionString() throws Exception {
EnvironmentTestUtils.addEnvironment(this.context, "flyway.baseline-version=0");
registerAndRefresh(EmbeddedDataSourceConfiguration.class,
FlywayAutoConfiguration.class,
@ -208,6 +210,18 @@ public class FlywayAutoConfigurationTests {
equalTo(MigrationVersion.fromVersion("0")));
}
@Test
public void overrideBaselineVersionNumber() throws Exception {
Map<String, Object> source = Collections.<String, Object>singletonMap("flyway.baseline-version", 1);
this.context.getEnvironment().getPropertySources().addLast(new MapPropertySource("flyway", source));
registerAndRefresh(EmbeddedDataSourceConfiguration.class,
FlywayAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
Flyway flyway = this.context.getBean(Flyway.class);
assertThat(flyway.getBaselineVersion(),
equalTo(MigrationVersion.fromVersion("1")));
}
private void registerAndRefresh(Class<?>... annotatedClasses) {
this.context.register(annotatedClasses);
this.context.refresh();

Loading…
Cancel
Save