2017-05-11 1 views
3

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!

Antwort

2

Um Wert von Immobilien Quelle erhalten mit @Value Sie ${} Syntax verwenden:

@Autowired 
public void setFoo(@Value("${test}")String value){ 
    foo=value; 
} 

Werfen Sie einen Blick offizielle documentation an.

+1

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! –

Verwandte Themen