Eu quero ter uma lista de valores em um arquivo .properties, ou seja:
my.list.of.strings=ABC,CDE,EFG
E para carregá-lo diretamente na minha classe, ou seja:
@Value("${my.list.of.strings}")
private List<String> myList;
Pelo que entendi, uma alternativa de fazer isso é tê-lo no arquivo de configuração da primavera e carregá-lo como uma referência de bean (me corrija se estiver errado), ou seja,
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
Mas existe alguma maneira de fazer isso? usando um arquivo .properties? ps: eu gostaria de fazer isso sem nenhum código personalizado, se possível.
java
spring
spring-properties
JackDev
fonte
fonte
org.springframework.expression.spel.SpelEvaluationException
exceção e nãojavax.el.ELException
. Seu objeto foi criado pelo Spring?my.list.of.strings=
? Eu esperaria que essa funcionalidade recuperasse a lista vazia, onde aqui estará um item (string vazia), não?item1, item2, item3
podem dar o resultado que você realmente não espera (dica: espaços).@Value("#{'${my.list.of.strings}'.split(',\\s*')}")
Desde o Spring 3.0, você pode adicionar uma linha como
ao seu
applicationContext.xml
(ou onde você configura as coisas). Como Dmitry Chornyi aponta em um comentário, a configuração baseada em Java se parece com:Isso ativa o novo serviço de configuração que suporta a conversão
String
emCollection
tipos. Se você não ativar esse serviço de configuração, o Spring recorrerá a seus editores de propriedades herdados como serviços de configuração, que não suportam esse tipo de conversão.A conversão para coleções de outros tipos também funciona:
funcionará com uma linha como
Não há problemas com espaço em branco lá,
ConversionServiceFactoryBean
ele cuida disso.Consulte http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config
fonte
split()
em cada expressão, ele também lida adequadamente uma lista vazia em vez de dar-lhe[null]
Se você está lendo isso e está usando o Spring Boot , tem mais 1 opção para esse recurso
Geralmente, a lista separada por vírgula é muito desajeitada para o caso de uso do mundo real (e às vezes nem é possível, se você quiser usar vírgulas na sua configuração):
Com o Spring Boot , você pode escrevê-lo assim (Índice começa em 0):
E use-o assim:
fonte
Especificando o
my.list.of.strings=ABC,CDE,EFG
arquivo .properties e usando@Value("${my.list.of.strings}")
private String[] myString;
Você pode obter as matrizes de strings. E usando
CollectionUtils.addAll(myList, myString)
, você pode obter a lista de strings.fonte
Você considerou
@Autowired
o construtor ou o levantador eString.split()
o corpo?Costumo preferir fazer minha fiação automática de uma dessas maneiras para melhorar a testabilidade do meu código.
fonte
Se você estiver usando o Spring Boot 2, ele funcionará como está, sem nenhuma configuração adicional.
fonte
private List<String> myList;
Todas as respostas acima estão corretas. Mas você pode conseguir isso em apenas uma linha. Por favor, tente seguir a declaração e você obterá todos os valores separados por vírgula em uma lista de String.
E você também precisa ter a seguinte linha definida na sua configuração xml.
basta substituir o caminho e o nome do arquivo de propriedades. E você está pronto para ir. :)
Espero que isso ajude você. Felicidades.
fonte
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
Se você estiver usando a versão mais recente do framework Spring (Spring 3.1+ eu acredito), não precisará dividir essas coisas no SpringEL,
Basta adicionar PropertySourcesPlaceholderConfigurer e DefaultConversionService na classe de configuração do Spring (aquela anotada com Configuration), por exemplo,
e na sua aula
e no arquivo de propriedades
Sem DefaultConversionService, você só pode colocar String separada por vírgula na matriz String quando injetar o valor em seu campo, mas DefaultConversionService faz algumas magias convenientes para você e as adiciona a Collection, Array etc. (verifique a implementação, se desejar gostaria de saber mais sobre isso)
Com esses dois, ele lida com todos os espaços em branco redundantes, incluindo nova linha, para que você não precise adicionar lógicas adicionais para apará-los.
fonte
você pode fazer isso com anotações como esta
aqui my.list.of.strings será selecionado no arquivo de propriedades, se não estiver lá, os padrões a, b, c serão usados
e no seu arquivo de propriedades, você pode ter algo parecido com isto
my.list.of.strings = d, e, f
fonte
Cuidado com os espaços nos valores. Eu posso estar errado, mas acho que os espaços na lista separada por vírgulas não são truncados usando @Value e Spel. A lista
seria lido como uma lista de strings
Na maioria dos casos, você provavelmente não gostaria dos espaços!
A expressão
daria a você uma lista de strings:
A expressão regular remove todos os espaços antes e depois de uma vírgula. Os espaços dentro dos valores não são removidos. assim
deve resultar em valores
fonte
@Value("#{'${foobar}'.trim().split( *, *)}")
Eu acho que isso é mais simples para pegar o array e remover os espaços:
fonte
No meu caso de uma lista de números inteiros funciona isso:
Arquivo de propriedade:
fonte
Considere usar a Configuração do Commons. Ele foi incorporado ao recurso para quebrar uma entrada no arquivo de propriedades na matriz / lista. Pentear com SpEL e @Value deve dar o que você deseja
Conforme solicitado, eis o que você precisa (ainda não tentei o código, pode ter erros de digitação, tenha paciência comigo):
Na Configuração do Apache Commons, há PropertiesConfiguration. Ele suporta o recurso de conversão de string delimitada em array / lista.
Por exemplo, se você tiver um arquivo de propriedades
Com o código abaixo:
lhe dará uma série de strings de
["bar1", "bar2", "bar3"]
Para usar com o Spring, faça isso no contexto do aplicativo xml:
e coloque isso no seu feijão de primavera:
Eu acredito que isso deve funcionar: P
fonte
Minha maneira preferida (para strings, em particular), é a seguinte:
E use
Dessa forma, você também pode incluir vírgulas no seu parâmetro. Também funciona para conjuntos.
fonte
se usando espaços reservados de propriedade, o exemplo ser1702544 se tornaria
Com espaço reservado xml:
fonte
Estou usando o Spring Boot 2.2.6
Meu arquivo de propriedades:
Meu código:
Funciona bem
fonte