Я загружаю атрибуты свойств из .properties
файла с помощью Spring следующим образом:
file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6
XML-файл spring
file: myapplication.xml
<bean id="some"
class="com.some.Class">
<property name="property" value="#{base.module.elementToSearch}" />
</bean>
И мой Class.java
file: Class.java
public void setProperty(final List<Integer> elements){
this.elements = elements;
}
Но при отладке элементы параметров получают только последний элемент в списке, поэтому есть список из одного элемента со значением «6», а не список из 6 элементов.
Я пробовал другие подходы, такие как добавление только значения, #{base.module}
но затем он не находил параметра в файле свойств.
Обходной путь - иметь в файле elements.properties список, разделенный запятыми, например:
base.module.elementToSearch=1,2,3,4,5,6
и использовать его как строку и проанализировать ее, но есть ли лучшее решение?
java
spring
placeholder
properties-file
РамонБоза
источник
источник
Ответы:
Если вы определяете свой массив в файле свойств, например:
base.module.elementToSearch=1,2,3,4,5,6
Вы можете загрузить такой массив в свой класс Java следующим образом:
@Value("${base.module.elementToSearch}") private String[] elementToSearch;
источник
List<String>
таким же образом, похоже, не работает (в списке будет только один элемент).String[]
as type работает, где использованиеList<String>
не работает.List<String>
вместоString[]
, вам нужно добавить как минимум a<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
в вашapplicationContext.xml
. В противном случае служба преобразования не используется, а используются редакторы свойств по умолчанию, которые не поддерживают преобразование строк в коллекции, а только массивы: docs.spring.io/spring/docs/current/spring-framework-reference/…И если у вас другой разделитель, кроме запятой, вы также можете использовать его.
@Value("#{'${my.config.values}'.split(',')}") private String[] myValues; // could also be a List<String>
а также
в свойствах вашего приложения вы могли бы иметь
источник
Вот пример того, как это можно сделать в Spring 4.0+
application.properties
содержание:Код Java:
@Autowire private Environment env; ... String[] springRocks = env.getProperty("some.key", String[].class);
источник
С помощью Spring Boot можно делать следующее:
application.properties
Класс конфигурации
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component @ConfigurationProperties public class Configuration { List<String> values = new ArrayList<>(); public List<String> getValues() { return values; } }
Это необходимо, без этого класса или без
values
класса in он не работает.Класс приложения Spring Boot
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.List; @SpringBootApplication public class SpringBootConsoleApplication implements CommandLineRunner { private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class); // notice #{} is used instead of ${} @Value("#{configuration.values}") List<String> values; public static void main(String[] args) { SpringApplication.run(SpringBootConsoleApplication.class, args); } @Override public void run(String... args) { LOG.info("values: {}", values); } }
источник
Если вам нужно передать символ звездочки, вы должны заключить его в кавычки.
В моем случае мне нужно настроить cors для веб-сокетов. Итак, я решил поместить URL-адреса cors в application.yml. Для prod env я буду использовать определенные URL-адреса, но для разработчиков можно использовать только *.
В yml файле у меня есть:
websocket: cors: "*"
В классе Config у меня есть:
@Value("${websocket.cors}") private String[] cors;
источник