24

Как я могу вставлять значения в карту из файла свойств, используя аннотацию @Value весной?Как ввести карту с помощью аннотации @Value Spring?

My Spring Java класс и я попытался с помощью $, но получил следующее сообщение об ошибке

Не удалось autowire поле: частная java.util.Map Test.standard; вложенное исключение java.lang.IllegalArgumentException: Не удалось разрешить заполнитель «com.test.standard» в строковое значение «$ {com.test.standard}»

@ConfigurationProperty("com.hello.foo") 
public class Test { 

    @Value("${com.test.standard}") 
    private Map<String,Pattern> standard = new LinkedHashMap<String,Pattern> 

    private String enabled; 

} 

У меня есть следующие свойства в. файл свойств

com.test.standard.name1=Pattern1 
com.test.standard.name2=Pattern2 
com.test.standard.name3=Pattern3 
com.hello.foo.enabled=true 
+0

Вам нужно будет использовать весенний язык выражения. Аналогичный вопрос, который использовал список (https://stackoverflow.com/questions/27390363/spring-how-to-inject-an-inline-list-of-strings-using-value-annotation). Я не уверен, что вы можете делать то, что хотите, из коробки. Этот вопрос https: // stackoverflow.com/questions/28369458/how-to-fill-hashmap-from-java-property-file-with-spring-value немного больше. Использует настраиваемое свойство mapper –

+0

Что именно вы хотите на своей карте? Кажется, вы также ожидаете, что какой-то тип конвертируется в «Pattern»? Что это за класс «Pattern»? –

+0

@Erlandsson это шаблон RegEx, мы будем определять действительные строки шаблонов регулярных выражений в значении – yathirigan

ответ

10

Я считаю, что Spring Boot поддерживает загрузку карт свойств из коробки с аннотацией @ConfigurationProperties.

Согласно, что документы можно загрузить свойства:

my.servers[0]=dev.bar.com 
my.servers[1]=foo.bar.com 

в фасоли, как это:

@ConfigurationProperties(prefix="my") 
public class Config { 

    private List<String> servers = new ArrayList<String>(); 

    public List<String> getServers() { 
     return this.servers; 
    } 
} 

Я использовал @ConfigurationProperties особенность раньше, но без загрузки на карте. Чтобы включить эту функцию, вам необходимо использовать @EnableConfigurationProperties annotation.

Прохладный материал об этой функции - это то, что вы можете validate your properties.

+0

да, но проблема моя .. Класс Test имеет свой собственный префикс @ConfigurationProperties. Поэтому я хочу использовать префикс diff для этой переменной-члена. Как я могу это сделать ? – yathirigan

+1

Хмм, я пропустил это. Поэтому я бы создал отдельные два компонента с аннотацией @ConfiguraitonProperties и передал их в тестовый класс. – luboskrnac

+0

хорошая идея .. я попробую это .. – yathirigan

7

Вы можете вводить .properties как карту в вашем классе с помощью @Resource аннотацию.

Если вы работаете с XML based configuration, добавьте ниже боба в файле конфигурации пружины:

<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
     <property name="location" value="classpath:your.properties"/> 
</bean> 

Для, аннотации на основе:

@Bean(name = "myProperties") 
public static PropertiesFactoryBean mapper() { 
     PropertiesFactoryBean bean = new PropertiesFactoryBean(); 
     bean.setLocation(new ClassPathResource(
       "your.properties")); 
     return bean; 
} 

Затем вы можете их забрать в вашей заявке в качестве карты:

@Resource(name = "myProperties") 
private Map<String, String> myProperties; 
+0

. Мы использовали Spring Config Config server для предоставления конфигураций, поэтому подход класса-класса может не работать. И мы не используем XML – yathirigan

52

Вы можете вводить значения в карту из файла свойств, используя аннотацию @Value.

Свойство в файле свойств.

propertyname={key1:'value1',key2:'value2',....} 

В вашем коде.

@Value("#{${propertyname}}") private Map<String,String> propertyname; 

Обратите внимание на хэштег как часть аннотации.

+1

значения должны быть кавычками, иначе я получаю 'SpelEvaluationException' –

+2

Как установить значение по умолчанию, если свойство отсутствует, чтобы исключить исключение? – okwap

+0

Если вы хотите использовать строки с пробелами (например, _USB Camera 0xfd120000046d0819_) в качестве ключей, используйте одинарные кавычки как для значений. – partTimeNinja

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