2016-06-15 4 views
1

У меня есть файл свойств, который управляется в классическим способом по PropertyPlaceholderConfigurer:Java Spring PropertyPlaceholderConfigurer и как обрезать пробельные/вкладки в свойствах файла

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:mail.properties" /> 
</bean> 

и

<bean id="jobDataPathUtils" class="com.hello.test.DataPathUtils"> 
    <property name="host" value="${smtp.host}" /> 
    <property name="port" value="${smtp.port}" /> 
    <property name="username" value="${smtp.user}" /> 
    <property name="password" value="${smtp.pass}" /> 
</bean> 

Проблема, что я есть много String свойства в файле .properties, около 30 записей, а если кто-то добавляет табуляцию в конце значения свойства, приложение не сможет правильно использовать эти свойства. Я хотел бы обрезать каждое значение свойства перед его использованием. Я могу сделать это вручную, используя .trim() для каждого свойства класса DataPathUtils, но мне интересно, есть ли другие способы сделать это, либо с помощью PropertyPlaceholderConfigurer, либо ...?

Спасибо заранее,

+0

Я не знаю, если это возможно, но вы уверены, что хотите это сделать? Вы уверены, что все записи должны быть обрезаны? Некоторые провайдеры допускают пробелы в пользователе и пароль. Я думаю, что обрезка внутри DataPathUtils - лучшая идея. –

+0

Что вы подразумеваете под таблицей? вы можете привести пример – Mudassar

+0

@Mudassar, это символ табуляции, когда вы нажимаете клавишу Tab на клавиатуре, вы получаете его –

ответ

1
  • Я думаю, что путь ваши данные введены, который конечные пробелы должны быть решены.
  • Если источник не может контролироваться, вам необходимо будет расширить PropertyPlaceholderConfigurer и обрезать его processProperties(). Используя этот подход, вы можете изменить ситуацию в будущем в соответствии с требованием, например, получать данные из базы данных или изменять пару определенных ключей или кешировать.

     public class CustomPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { 
          /** 
         * Map that hold all the properties. 
          */ 
         private Map<String, String> propertiesMap; 
         /** 
         * Iterate through all the Propery keys and build a Map, resolve all the nested values before beuilding the map. 
         */ 
         @Override 
         protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props) throws BeansException { 
          super.processProperties(beanFactory, props); 
    
          propertiesMap = new HashMap<String, String>(); 
          for (Object key : props.keySet()) { 
           String keyStr = key.toString(); 
           String valueStr = prop.getProperty(keyStr); 
           propertiesMap.put(keyStr.trim(), valueStr.trim()); 
          } 
         } 
    
    
         public String getProperty(String name) { 
          return propertiesMap.get(name).toString(); 
         } 
    
+0

спасибо, я постараюсь реализовать пользовательский PropertyPlaceholderConfigurer! –

+0

Я переустановил функцию resolvePlaceholder (String placeholder, Свойства реквизит, int systemPropertiesMode) в классе PropertyPlaceholderConfigurer. Это решило мою проблему. Но я согласен с вами в том, что изначально было бы лучше изменить способ инициализации файлов свойств, но, к сожалению, это часть моей работы, и у меня нет доступа к ней. –