Plik Spring .properties: pobierz element jako Array

94

Ładuję atrybuty właściwości z .propertiespliku przy użyciu Spring w następujący sposób:

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

Plik źródłowy xml

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

I moja Class.java

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

Ale podczas debugowania elementy parametrów otrzymują tylko ostatni element listy, więc istnieje lista zawierająca jeden element o wartości „6” zamiast listy zawierającej 6 elementów.

Próbowałem innych podejść, takich jak dodawanie tylko wartości, #{base.module}ale wtedy nie znalazłem żadnego parametru w pliku właściwości.

Aby obejść ten problem, należy umieścić w pliku elements.properties listę oddzieloną przecinkami, na przykład:

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

i użyj go jako ciągu i przeanalizuj go, ale czy jest lepsze rozwiązanie?

RamonBoza
źródło
więc muszę przekazać go jako ciąg oddzielony przecinkami i przeanalizować metodę.
RamonBoza
Dokładnie, chociaż jest już kilka bibliotek, które już to robią (apache commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert
Oto odpowiedź, która przynajmniej daje wynik Set <String>. Niezupełnie List <String>, ale prawdopodobnie wystarczające w wielu przypadkach! stackoverflow.com/questions/5274362/…
John Rix

Odpowiedzi:

194

Jeśli zdefiniujesz tablicę w pliku właściwości, takim jak:

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

Możesz załadować taką tablicę w swojej klasie Java w następujący sposób:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
svlada
źródło
5
Moje elementy zawierają przecinek. Jak wyjść z separatora? '\,' nawet '\\,' nie działają.
banterCZ
Możesz spróbować pobrać je jako listę liczb całkowitych, a następnie przekonwertować je @Value ("$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Gal Bracha
+1, właśnie to, czego potrzebowałem. Niestety, odczytanie wartości oddzielonych przecinkami do a List<String>w ten sam sposób nie wydaje się działać (lista będzie miała tylko jeden element).
Jonik
5
Mogę potwierdzić, że używanie String[]jako typu działa tam, gdzie List<String>nie działa.
Wim Deblauwe
3
Jeśli chcesz, aby to działało List<String>zamiast String[], musisz dodać co najmniej a <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">do swojego applicationContext.xml. W przeciwnym razie usługa konwersji nie jest używana, ale domyślne edytory właściwości, które nie obsługują konwersji ciągów znaków
Clemens Klein-Robbenhaar
37

I dodaj inny separator inny niż przecinek, możesz go również użyć.

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

i

we właściwościach aplikacji, które możesz mieć

my.config.values=value1, value2, value3
RK Punjal
źródło
to użycie działa również z innymi adnotacjami, użyłem jak @KafkaListener {topics = "# {'$ {ArrayProperty}'. split (',')}"} dla wiosennego słuchacza kafka
AsyncTask
32

Oto przykład, jak możesz to zrobić na wiosnę 4.0+

application.properties zadowolony:

some.key=yes,no,cancel

Kod Java:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);
Juha Hanka
źródło
tego właśnie chcę, ale w zmiennych env ... powinienem móc użyć SOME_KEY_0_ = tak SOME_KEY_1 = nie itd. w zmiennych środowiskowych, ale moje getProperty wraca do wartości zerowej
rabarbar
1

Dzięki Spring Boot można wykonać następujące czynności:

application.properties

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

Klasa konfiguracji

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

}

Jest to potrzebne, bez tej klasy lub bez valuesklasy w klasie nie działa.

Spring Boot Application, klasa

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
źródło
0

Jeśli chcesz przekazać symbol gwiazdki, musisz go umieścić w cudzysłowie.

W moim przypadku muszę skonfigurować cors dla websockets. Postanowiłem więc umieścić adresy URL cors w application.yml. W przypadku produktów env użyję określonych adresów URL, ale w przypadku deweloperów można użyć tylko *.

W pliku yml mam:

websocket:
  cors: "*"

W klasie Config mam:

@Value("${websocket.cors}")
private String[] cors;
Ruslan Sheremet
źródło