2015-11-14 2 views
1

Я хотел бы добавить новый источник собственности, который можно использовать для чтения значений свойств в приложении. Я хотел бы сделать это с помощью Spring. У меня есть такой код в классе @Configuration:Каков наилучший способ добавить новый источник недвижимости весной?

@Bean 
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {   
    PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer(); 
    MutablePropertySources sources = new MutablePropertySources(); 
    MyCustomPropertySource propertySource = new MyCustomPropertySource("my custom property source"); 
    sources.addFirst(propertySource); 
    properties.setPropertySources(sources); 
    return properties; 
} 

Это похоже на работу очень хорошо. Однако то, что он также делает, переопределяет другие значения свойств (например, свойство server.port в файле application.properties, используемом весной загрузки), которые я не хочу перезаписывать. Итак, основной вопрос заключается в том, что лучший способ добавить этот ресурс propertys, но не переопределить его. Любой способ захватить существующие ресурсы собственности и просто добавить к нему?

ответ

0

Возможно, вы добавите свой источник собственности прямо в среду после его инициализации.

EDIT: Как это сделано ПОСЛЕ класс обрабатывается, вы не можете ожидать, что @Value аннотаций подобрать что-нибудь из этого конкретного PropertySource в том же классе @Configuration - или любой другой, который загружается раньше.

@Configuration 
public class YourPropertyConfigClass{ 

    @Value("${fromCustomSource}") 
    String prop; // failing - property source not yet existing 

    @Autowired 
    ConfigurableEnvironment env; 

    @PostConstruct 
    public void init() throws Exception { 
     env.getPropertySources().addFirst(
      new MyCustomPropertySource("my custom property source")); 
    } 
} 

@Configuration 
@DependsOn("YourPropertyConfigClass") 
public class PropertyUser { 

    @Value("${fromCustomSource}") 
    String prop; // not failing 
} 

Вы можете переместить @PostConstruct в отдельный класс @Configuration и отметьте другие классы, используя эти свойства @DependOn("YourPropertyConfigClass") (это работает - но, возможно, есть лучший способ заставить порядок конфигурации).

В любом случае - это стоит того, если MyCustomPropertySource не может быть просто добавлен с помощью @PropertySource("file.properties") аннотации - что бы решить проблему для простых файлов свойств.

+0

Я выстрелил, но это, похоже, не сработало. Я только что заменил свой метод на этот, но затем все мои аннотации @value начали сбой. Я думаю, что это правильный путь. –

+0

Вы разрешаете. @ Аннотации значения во время конфигурации (в классах @Configuration) - или это делается позже? – JockX

+0

Он находится в классе конфигурации. –

0

Одна вещь, которую вы можете попробовать, это установить IgnoreUnresolvablePlaceholders в TRUE. У меня была аналогичная проблема, которую я смог решить таким образом. В моем случае у меня был другой менеджер-заполнитель, который работал, но свойства во втором не разрешались, если я не установил это свойство в TRUE.

@Bean 
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {   
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
    propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(Boolean.TRUE); 
    propertySourcesPlaceholderConfigurer.setIgnoreResourceNotFound(Boolean.TRUE); 
    return propertySourcesPlaceholderConfigurer; 
} 
0

Если вы реализуете PropertySourceFactory как таковой:

import org.springframework.core.env.PropertySource; 
import org.springframework.core.io.support.EncodedResource; 
import org.springframework.core.io.support.PropertySourceFactory; 

public class CustomPropertySourceFactory implements PropertySourceFactory { 
    @Override 
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) { 
     ... 
    } 
} 

Вы можете использовать следующий источник собственности:

@PropertySource(name="custom-prop-source", value="", factory=CustomPropertySourceFactory.class) 

Вид хак-иш, но это работает.

Смежные вопросы