I have spring Java config object that loads my properties but does not override the MessageSource tokens.
@Configuration
@SuppressWarnings("unused")
public class PropertyConfiguration {
public static final String PROPERTY_OVERRIDE_URL = "d2.config.location";
@Bean
public UrlResource propertyOverrideUrl() {
String propertyOverrideUrl = System.getProperty(PROPERTY_OVERRIDE_URL);
UrlResource overrideUrl = null;
// just add a bogus url as to not get a malformed URL
try{
overrideUrl = new UrlResource(
(propertyOverrideUrl == null || "".equals(propertyOverrideUrl)? "file:///FILENOTFOUND" : propertyOverrideUrl)
);
} catch (MalformedURLException e){
// Set the URL to a dummy value so it will not break.
try{
overrideUrl = new UrlResource("file:///FILENOTFOUND");
} catch (MalformedURLException me){
// this is a valid URL, but will not be found at runtime.
}
}
return overrideUrl;
}
@Bean
@DependsOn("propertyOverrideUrl")
@Lazy(false)
public ContextAwarePropertyPlaceholderConfigurer propertyPlaceholderConfigurer()
throws IOException{
return new ContextAwarePropertyPlaceholderConfigurer(){{
setLocations(new Resource[]{
new ClassPathResource("application_prompts.properties"),
new ClassPathResource("application_webservice.properties"),
new ClassPathResource("application_externalApps.properties"),
new ClassPathResource("application_log4j.properties"),
new ClassPathResource("application_fileupload.properties"),
//Must be last to override all other resources
propertyOverrideUrl()
});
setIgnoreResourceNotFound(true);
}};
}
When I run a unit test on the javaconfig property it is fine:
@Test
public void testOverrides__Found() throws Exception {
setOverrideUrlSystemProperty("/target/test/resources/override-test.properties");
context = SpringContextConfigurationTestHelper.createContext();
context.refresh();
String recordedPaymentConfirmationPath =
(String)context.getBean("recordedPaymentConfirmationPath");
assertThat(recordedPaymentConfirmationPath, is("test/dir/recordings/"));
String promptServerUrl =
(String)context.getBean("promptServerUrl");
assertThat(promptServerUrl, is("http://test.url.com"));
}
But when I try the value of the MessageSource, it still has the old value:
@Test
public void testOverrides__XYZ() throws Exception {
setOverrideUrlSystemProperty("/target/test/resources/override-test.properties");
context = SpringContextConfigurationTestHelper.createContext();
context.refresh();
String promptServerUrl = (String)开发者_开发知识库context.getMessage("uivr.prompt.server.url",
new Object[] {}, Locale.US);
assertThat(promptServerUrl, is("http://test.url.com"));
}
The output:
[junit] Testcase: testOverrides__XYZ took 0.984 sec
[junit] FAILED
[junit]
[junit] Expected: is "http://test.url.com"
[junit] got: "http://24.40.46.66:9010/agent-ivr-prompts/"
[junit]
[junit] junit.framework.AssertionFailedError:
[junit] Expected: is "http://test.url.com"
[junit] got: "http://24.40.46.66:9010/agent-ivr-prompts/"
[junit]
[junit] at com.comcast.ivr.agent.configuration.PropertyOverrideConfigurationTest.testOverrides__XYZ(PropertyOverrideConfigurationTest.java:114)
Can someone please help me find a way to override the MessageSource because that is what is used in our velocity templates:
#set($baseUrl = "#springMessage('uivr.prompt.server.url')")
I added some logging:
@Override
protected void loadProperties(Properties props) throws IOException {
super.loadProperties(props);
super.mergeProperties();
if(logger.isDebugEnabled()){
System.out.println("--------------------");
for (Map.Entry entry : props.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
logger.info(entry.getKey() + ":" + entry.getValue());
}
System.out.println("--------------------");
}
}
And the values are printed as expected.
...
[junit] uivr.prompt.server.url:http://test.url.com
...
A couple side notes about the annotations used on your propertyPlaceholderConfigurer()
@Bean
method:
- @
Lazy(false)
is unnecessary, as it is already the default. You can omit this. @DependsOn("propertyOverrideUrl")
is unnecessary, because the dependency is already established by callingpropertyOverrideUrl()
from within thepropertyPlaceholderConfigurer()
On to your actual question, it's a bit tough to answer because I'm not sure what ContextAwareProperyPlaceholderConfigurer
does (I'm assuming it's a custom component as it's not part of the core Spring Framework).
That aside, there may simply be a misunderstanding going on. Spring's PropertyPlaceholderConfigurer
(PPC) and friends operate by post-processing bean definitions to replace ${...}
placeholders, but don't interact with MessageSource
objects in any way. So the behavior you describe is, I believe, as expected: You would see the 'correct' URL when interrogating the bean (because it has been post-processed by your PPC), however you see the 'incorrect' url when interrogating the message source (because it is totally unrelated to PPC post-processing).
Hope this helps.
精彩评论