Arquivo Spring .properties: obter o elemento como um Array

91

Estou carregando atributos de propriedades de um .propertiesarquivo usando Spring da seguinte maneira:

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

O arquivo xml spring

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>

E meu Class.java

file: Class.java
public void setProperty(final List<Integer> elements){
    this.elements = elements;
}

Mas, durante a depuração, os elementos de parâmetro só obtêm o último elemento da lista, portanto, há uma lista de um elemento com valor "6", em vez de uma lista com 6 elementos.

Tentei outras abordagens, como adicionar valor apenas, #{base.module}mas depois não encontrou nenhum parâmetro no arquivo de propriedades.

Uma solução alternativa é ter no arquivo elements.properties uma lista separada por vírgulas, como:

base.module.elementToSearch=1,2,3,4,5,6

e usá-lo como uma string e analisá-lo, mas há uma solução melhor?

RamonBoza
fonte
então preciso passá-lo como uma string separada por vírgulas e analisar no método.
RamonBoza
Exatamente, embora já haja algumas libs fazendo isso por você (apache commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert
Aqui está uma resposta que fornece pelo menos um resultado Definir <String>. Não é bem uma Lista <String>, mas provavelmente suficiente em muitos casos! stackoverflow.com/questions/5274362/…
John Rix,

Respostas:

189

Se você definir sua matriz no arquivo de propriedades como:

base.module.elementToSearch=1,2,3,4,5,6

Você pode carregar tal array em sua classe Java desta forma:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
svlada
fonte
5
Meus elementos contêm vírgula. Como faço para escapar do separador? '\,' mesmo '\\,' não funcionam.
banterCZ
Você pode tentar obtê-los como uma lista de inteiros e depois convertê-los @Value ("$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Gal Bracha
1, apenas o que eu precisava. Infelizmente, ler valores separados por vírgula em um List<String>da mesma maneira não parece funcionar (a lista terá apenas um elemento).
Jonik
4
Posso confirmar que usar String[]como tipo funciona, enquanto usar List<String>não funciona.
Wim Deblauwe
2
Se quiser que funcione com, em List<String>vez de String[], você precisará adicionar pelo menos a <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">ao seu applicationContext.xml. Caso contrário, o serviço de conversão não é usado, mas os editores de propriedade padrão, que não oferecem suporte à conversão de Strings em coleções, apenas arrays: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar
36

E, no caso de você usar um delimitador diferente de vírgula, você também pode usá-lo.

@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues;   // could also be a List<String>

e

nas propriedades do seu aplicativo, você poderia ter

my.config.values=value1, value2, value3
RK Punjal
fonte
este uso também funciona com outras anotações, eu usei como @KafkaListener {topics = "# {'$ {ArrayProperty}'. split (',')}"} para ouvinte kafka de primavera
AsyncTask
32

Aqui está um exemplo de como você pode fazer isso no Spring 4.0+

application.properties conteúdo:

some.key=yes,no,cancel

Código Java:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);
Juha Hanka
fonte
isso é o que eu quero, mas em env vars ... Devo ser capaz de usar SOME_KEY_0_ = sim SOME_KEY_1 = não, etc em env vars, mas meu getProperty está voltando null
Rhubarb
0

Com um Spring Boot, pode-se fazer o seguinte:

application.properties

values[0]=abc
values[1]=def

Classe de configuração

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;
    }

}

Isso é necessário, sem essa aula ou sem a valuesaula não está funcionando.

Classe Spring Boot Application

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);
    }

}
Betlista
fonte
0

Se você precisa passar o símbolo de asterisco, você deve colocá-lo entre aspas.

No meu caso, preciso configurar cors para websockets. Então, decidi colocar urls de cors em application.yml. Para env de prod, usarei urls específicas, mas para dev, pode usar apenas *.

No arquivo yml eu tenho:

websocket:
  cors: "*"

Na classe de configuração, tenho:

@Value("${websocket.cors}")
private String[] cors;
Ruslan Sheremet
fonte