Überschreiben Spring @PropertySource von @Import
Habe ich eine Eigenschaft test=default
in der Klasse DefaultConfig, und ich mache Ihnen zur Verfügung mit @PropertySource annotation.
@Configuration
@PropertySource("classpath:default.properties")
public class DefaultConfig {}
Dann möchte ich in der Lage sein, zu überschreiben, zu test=override
, die in einer anderen Datei Eigenschaften in der Klasse OverrideConfig, so dass ich wieder @PropertySource.
@Configuration
@Import(DefaultConfig.class)
@PropertySource("classpath:override.properties")
public class OverrideConfig {}
Konfiguriere ich einen test, um zu beweisen, dass es funktioniert.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={OverrideConfig.class})
public class TestPropertyOverride {
@Autowired
private Environment env;
@Test
public void propertyIsOverridden() {
assertEquals("override", env.getProperty("test"));
}
}
Außer natürlich es nicht.
org.junit.ComparisonFailure: expected:<[override]> but was:<[default]>
Maxing Debuggen kann ich sehen, was passiert:
StandardEnvironment:107 - Adding [class path resource [default.properties]] PropertySource with lowest search precedence
StandardEnvironment:107 - Adding [class path resource [override.properties]] PropertySource with lowest search precedence
Scheint es rückwärts. Bin ich ein einfacher Fehler oder misthinking, oder würde Sie erwarten, dass die Eigenschaften definiert, die durch ein @ - PropertySource in einer @Import-ed-Konfiguration-Klasse überschrieben werden durch Eigenschaften definiert bin @PropertySource in der @Import-ing-Klasse?
- Was wahrscheinlich geschieht, ist, dass die Anmerkungen auf Ihre
OverrideConfig
Klasse werden zuerst ausgewertet und sotest=override
, dann dieDefaultConfig
- Klasse importiert und Ihre Anmerkungen werden ausgewertet undtest
überschrieben werden, umdefault
- Aufgeworfenen Problem jira.springsource.org/browse/SPR-10409
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Lösung durch Helder Sousa, wie geschrieben ein Kommentar von dem JIRA-issue erstellt von der OP:
Heute mit Feder 4 Sie können diese verwenden:
Und dies kann verwendet werden, um zu verwenden, und schließlich überschreiben von Eigenschaften für den junit-test:
Ich bin derzeit kämpfen mit einem ähnlichen Fall im Frühjahr 3.1, aber ich bin mit einem anderen Ansatz zum überschreiben von Eigenschaften, weil
@PropertySource
unterstützt nicht die optionale property-Dateien:Scheint es, dass
@Import
verursacht keine bestimmte Reihenfolge der@Configuration
Instanziierung auch immer neben der Ordnung diktiert von normaler bean-Abhängigkeiten. Weg zu zwingen, eine solche Anordnung ist zum injizieren der Basis@Configuration
Instanz selbst als eine Abhängigkeit. Sie könnten versuchen:Funktioniert diese Hilfe?
Und vielleicht ist die neue
ContextHierarchy
annotation könnte hier helfen auch aber ich habe nicht versucht, diese so weit.<context:property-placeholder ignore-resource-not-found="true" location="classpath:base.config,file:override.config" />
Sie durchsetzen könnten den laden, um Ihre Eigenschaften wie dieses:
Ich hatte ein ähnliches problem, und es gelang ihm in nur deklarieren, auch die default-Eigenschaft im custom-Konfiguration: