Ошибка получения Spring PropertyPlaceholderConfigurer для переопределения значений MessageSource - PullRequest
0 голосов
/ 13 января 2011

У меня есть объект конфигурации Java Spring, который загружает мои свойства, но не переопределяет токены MessageSource.

@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);
    }};
}

Когда я запускаю модульный тест для свойства javaconfig, все нормально:

    @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"));
}

Но когда я пробую значение MessageSource, оно по-прежнему будет иметь старое значение:

    @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"));
}

Выход:

[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)

Может кто-нибудь помочь мне найти способ переопределить MessageSource, потому что именно это используется в наших шаблонах скорости:

    #set($baseUrl = "#springMessage('uivr.prompt.server.url')")

Я добавил некоторые записи:

  @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("--------------------");
    }
}

И значения печатаются, как и ожидалось.

...
[junit] uivr.prompt.server.url:http://test.url.com
...

1 Ответ

0 голосов
/ 12 марта 2011

Пара замечаний по поводу аннотаций, используемых в вашем propertyPlaceholderConfigurer() @Bean методе:

  • @ Lazy(false) не требуется, так как это уже значение по умолчанию.Вы можете опустить это.
  • @DependsOn("propertyOverrideUrl") не требуется, поскольку зависимость уже установлена ​​путем вызова propertyOverrideUrl() изнутри propertyPlaceholderConfigurer()

на ваш актуальный вопрос, этонемного сложно ответить, потому что я не уверен, что делает ContextAwareProperyPlaceholderConfigurer (я предполагаю, что это пользовательский компонент, поскольку он не является частью ядра Spring Framework).

Помимо этого, может быть простонедоразумение происходит.PropertyPlaceholderConfigurer (PPC) и друзья Spring работают с определениями bean-объектов постобработки, чтобы заменить заполнители ${...}, но никак не взаимодействуют с MessageSource объектами.Таким образом, поведение, которое вы описываете, я полагаю, как и ожидалось: вы увидите «правильный» URL при опросе компонента (поскольку он был обработан вашим PPC), однако вы увидите «неправильный» URL при опросе сообщения.источник (потому что он абсолютно не связан с постобработкой PPC).

Надеюсь, это поможет.

...