Ich habe versucht, ein sehr einfaches Beispiel für eine benutzerdefinierte PropertySource zu erhalten, die in einer Spring-Anwendung ausgeführt wird.Spring PropertySourcesPlaceholderConfigururer verwendet keine benutzerdefinierte PropertySource für @Value
Das ist mein PropertySource:
public class RemotePropertySource extends PropertySource{
public RemotePropertySource(String name, Object source) {
super(name, source);
}
public RemotePropertySource(String name) {
super(name);
}
public Object getProperty(String s) {
return "foo"+s;
}
}
Auf das Application über eine ApplicationContextInitializer hinzugefügt wird:
public class RemotePropertyApplicationContextInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
public void initialize(GenericApplicationContext ctx) {
RemotePropertySource remotePropertySource = new RemotePropertySource("remote");
ctx.getEnvironment().getPropertySources().addFirst(remotePropertySource);
System.out.println("Initializer registered PropertySource");
}
}
Jetzt habe ich einen einfachen Unit-Test, um zu sehen, ob die PropertySource richtig verwendet wird:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RemotePropertySourceTest.ContextConfig.class, initializers = RemotePropertyApplicationContextInitializer.class)
public class RemotePropertySourceTest {
@Autowired
private UnderTest underTest;
@Autowired
Environment env;
@Test
public void testContext() {
assertEquals(env.getProperty("bar"),"foobar");
assertEquals(underTest.getFoo(),"footest");
}
@Component
protected static class UnderTest {
private String foo;
@Autowired
public void setFoo(@Value("test")String value){
foo=value;
}
public String getFoo(){
return foo;
}
}
@Configuration
@ComponentScan(basePackages = {"test.property"})
protected static class ContextConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
return configurer;
}
}
}
Zugriff auf den Wert über die Umgebung gibt mir t Das korrekte Ergebnis ("foobar"), aber die Verwendung der @ Value-Annotation schlägt fehl. Soweit ich in der Dokumentation gelesen habe, sollte der PropertySourcesPlaceholderConfigurer in meiner Konfiguration meine PropertySource automatisch von der Umgebung abholen, aber anscheinend nicht. Gibt es etwas, das mir fehlt?
Ich weiß, dass der Zugriff auf Eigenschaften explizit über die Umgebung vorzuziehen ist, aber die vorhandene Anwendung verwendet @ Value-Annotations sehr.
Jede Hilfe wird sehr geschätzt. Vielen Dank!
Nun, jetzt fühle ich mich wirklich dumm. Ich war so konzentriert darauf, den Kontext richtig zu machen, dass ich die falsche Syntax verwendete. Vielen Dank! –