Tệp .properties mùa xuân: lấy phần tử dưới dạng Mảng


91

Tôi đang tải các thuộc tính thuộc tính từ một .propertiestệp bằng Spring như sau:

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

Tệp xml mùa xuân

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

Và Class.java của tôi

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

Nhưng khi gỡ lỗi, các phần tử tham số chỉ lấy phần tử cuối cùng vào danh sách, do đó, có một danh sách gồm một phần tử có giá trị "6", thay vì một danh sách có 6 phần tử.

Tôi đã thử các cách tiếp cận khác, như chỉ thêm giá trị vào #{base.module}nhưng sau đó nó không tìm thấy tham số nào trong tệp thuộc tính.

Một cách giải quyết là có trong tệp Elements.properties một danh sách được phân tách bằng dấu phẩy, như:

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

và sử dụng nó như một Chuỗi và phân tích cú pháp nó, nhưng có giải pháp nào tốt hơn không?



vì vậy tôi cần chuyển nó dưới dạng một chuỗi được phân tách bằng dấu phẩy và phân tích cú pháp trong phương thức.
RamonBoza

Chính xác, mặc dù có một số libs đã làm điều đó cho bạn (apache commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert

Đây là một câu trả lời ít nhất cung cấp cho bạn kết quả Đặt <Chuỗi>. Không hẳn là một Danh sách <Chuỗi>, nhưng có lẽ đủ trong nhiều trường hợp! stackoverflow.com/questions/5274362/…
John Rix

Câu trả lời:


189

Nếu bạn xác định mảng của mình trong tệp thuộc tính như:

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

Bạn có thể tải mảng như vậy trong lớp Java của mình như sau:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;

5
Các phần tử của tôi chứa dấu phẩy. Làm cách nào để thoát khỏi dải phân cách? '\,' thậm chí '\\,' không hoạt động.
banterCZ

Bạn có thể thử lấy chúng dưới dạng danh sách các số nguyên và sau đó chuyển đổi chúng @Value ("$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Gal Bracha

+1, chỉ những gì tôi cần. Thật không may, việc đọc các giá trị được phân tách bằng dấu phẩy thành List<String>cùng một kiểu dường như không hoạt động (danh sách sẽ chỉ có một phần tử).
Jonik

4
Tôi có thể xác nhận rằng việc sử dụng String[]as type hoạt động, trong đó việc sử dụng List<String>không hoạt động.
Wim Deblauwe

2
Nếu bạn muốn điều này hoạt động với List<String>thay vì String[], bạn cần thêm ít nhất a <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">vào của bạn applicationContext.xml. Nếu không, dịch vụ chuyển đổi không được sử dụng nhưng trình chỉnh sửa thuộc tính mặc định, không hỗ trợ chuyển đổi Chuỗi thành tập hợp, chỉ có mảng: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar

36

Và trong trường hợp bạn có một dấu phân tách khác ngoài dấu phẩy, bạn cũng có thể sử dụng dấu phân cách đó.

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

trong thuộc tính ứng dụng của bạn, bạn có thể có

my.config.values=value1, value2, value3

sử dụng này cũng làm việc với các chú thích khác, tôi sử dụng như @KafkaListener {chủ đề = "# { '$ {ArrayProperty}' chia ( '')}."} cho mùa xuân Kafka nghe
AsyncTask

32

Đây là một ví dụ về cách bạn có thể làm điều đó trong Spring 4.0+

application.properties Nội dung:

some.key=yes,no,cancel

Mã Java:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);

đây là những gì tôi muốn, nhưng trong env vars ... Tôi sẽ có thể sử dụng SOME_KEY_0_ = yes SOME_KEY_1 = không, v.v. trong env vars, nhưng getProperty của tôi sắp trở lại rỗng
Rhubarb

0

Với Spring Boot, người ta có thể làm như sau:

application.properties

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

Lớp cấu hình

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

}

Điều này là cần thiết, nếu không có lớp này hoặc không có valuestrong lớp thì nó không hoạt động.

Lớp ứng dụng khởi động mùa xuân

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

}

0

Nếu bạn cần chuyển biểu tượng dấu hoa thị, bạn phải đặt nó bằng dấu ngoặc kép.

Trong trường hợp của tôi, tôi cần định cấu hình cors cho websockets. Vì vậy, tôi quyết định đặt url cors vào application.yml. Đối với prod env, tôi sẽ sử dụng các url cụ thể, nhưng đối với dev thì chỉ cần sử dụng * là được.

Trong tệp yml, tôi có:

websocket:
  cors: "*"

Trong lớp Cấu hình, tôi có:

@Value("${websocket.cors}")
private String[] cors;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.