Ссылка на свойство Escape в файле свойств Spring

Я хочу избежать моего файла свойств Spring, чтобы получить доступ к моему свойству bean: ${ROOTPATH}/relativePath

У меня есть простой файл конфигурации Spring, который содержит:

<context:property-placeholder location="classpath:myprops.properties" />

<bean id="myBean" class="spring.MyBean">
    <property name="myProperty" value="${myproperty}" />
</bean> 

myprops.properties содержит:

myproperty=\${ROOTPATH}/relativePath

Приведенная выше установка возвращает: Не удалось разрешить заполнитель "ROOTPATH". Я пробовал много возможных синтаксисов, но не смог найти правильный.


person Stephane    schedule 31.10.2012    source источник
comment
Год без комментариев. Вы решили эту проблему?   -  person Askar Kalykov    schedule 19.09.2013


Ответы (4)


Вместо ${myproperty} используйте #{'$'}{myproperty}. Просто замените $ на #{'$'}.

person user2428804    schedule 22.01.2014
comment
Нет, это не сработает. Это разрешится как ${myproperty}, введенное в myBean.myProperty буквально вместо ${ROOTPATH}/relativePath. - person t7tran; 09.12.2014
comment
Зависит от того, чего вы хотите добиться. Я думаю, вам нужно поставить это буквально как значение для myProperty. Если вы хотите разрешить ROOTPATH ​​откуда-то, например. системные свойства вы можете использовать Spring Expression Language SpEl. Например что-то вроде этого: #{ systemProperties['ROOTPATH'] }/relativePath - person user2428804; 03.03.2015

Пока кажется, что это не способ избежать ${}, однако вы можете попробовать приведенную ниже конфигурацию, чтобы решить проблему.

dollar=$

myproperty=${dollar}{myproperty}

Результат для моей собственности будет ${myproperty} после оценки.

person Allen Ai    schedule 21.02.2018

Вот находится запрос Spring, в котором запрашивается отказ от поддержки (все еще нерешенный на момент написания ).

Обходной путь использования

$=$
myproperty=${$}{ROOTPATH}/relativePath

действительно обеспечивает решение, но выглядит довольно грязным.

Использование выражений SPEL, таких как #{'$'}, не работало для меня с Spring Boot 1.5.7.

person Christian    schedule 22.02.2018

Хотя это работает, экранирование плейсхолдера очень уродливо.

Я добился этого, переопределив PropertySourcesPlaceholderConfigurer.doProcessProperties и используя пользовательский StringValueResolver

 public static class CustomPropertySourcesPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer {

    @Override
    protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess, StringValueResolver valueResolver) {
        StringValueResolver customValueResolver = strVal -> {
            if(strVal.startsWith("${something.")) {
                PropertySourcesPropertyResolver customPropertySourcesPropertyResolver = new PropertySourcesPropertyResolver(this.getAppliedPropertySources());
                String resolvedText = customPropertySourcesPropertyResolver.resolvePlaceholders(strVal);

                //remove the below check if you are okay with the property not being present (i.e remove if the property is optional)
                if(resolvedText.equals(strVal)) {
                    throw new RuntimeException("placeholder " + strVal + " not found");
                }
                return resolvedText;
            }
            else {
                //default behaviour
                return valueResolver.resolveStringValue(strVal);
            }
        };
        super.doProcessProperties(beanFactoryToProcess, customValueResolver);
    }
}

подключив его к приложению

@Configuration
public class PlaceHolderResolverConfig
{
  @Bean
  public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
     PropertySourcesPlaceholderConfigurer placeHolderConfigurer = new CustomPropertySourcesPlaceholderConfigurer();
     placeHolderConfigurer.setLocation(new ClassPathResource("application.properties"));
    
     return placeHolderConfigurer;
  }
}

В приведенном выше примере для всех свойств, начинающихся с something.*, вложенные заполнители не будут разрешены. Удалите галочку if(strVal.startsWith("${something.")), если вы хотите, чтобы поведение было для всех свойств

person SatheeshJM    schedule 19.06.2021