ไฟล์ Spring .properties: รับองค์ประกอบเป็น Array


94

ฉันกำลังโหลดคุณสมบัติคุณสมบัติจาก.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

และใช้เป็น String และแยกวิเคราะห์ แต่มีวิธีแก้ไขที่ดีกว่านี้หรือไม่?



ดังนั้นฉันต้องส่งมันเป็นสตริงที่คั่นด้วยลูกน้ำและแยกวิเคราะห์ในวิธีการ
RamonBoza

แน่นอนแม้ว่าจะมี libs บางตัวที่ทำสิ่งนั้นให้คุณแล้ว (apache commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert

นี่คือคำตอบที่อย่างน้อยก็ให้ผลลัพธ์ Set <String> ไม่ใช่รายการ <String> แต่อาจเพียงพอในหลาย ๆ กรณี! stackoverflow.com/questions/5274362/…
John Rix

คำตอบ:


194

หากคุณกำหนดอาร์เรย์ของคุณในไฟล์คุณสมบัติเช่น:

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

คุณสามารถโหลดอาร์เรย์ดังกล่าวในคลาส Java ของคุณได้ดังนี้:

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

5
องค์ประกอบของฉันประกอบด้วยลูกน้ำ ฉันจะหนีตัวคั่นได้อย่างไร '\,' แม้ '\\,' ไม่ทำงาน
banterCZ

คุณสามารถลองรับเป็นรายการจำนวนเต็มแล้วแปลงเป็น @Value ("$ {base.module.elementToSearch}") รายการส่วนตัว <Integer> elementToSearch;
Gal Bracha

+1 สิ่งที่ฉันต้องการ น่าเสียดายที่การอ่านค่าที่คั่นด้วยเครื่องหมายจุลภาคเป็นรูปList<String>แบบเดียวกันดูเหมือนจะไม่ได้ผล (รายการจะมีเพียงองค์ประกอบเดียว)
Jonik

5
ฉันสามารถยืนยันได้ว่าการใช้String[]เป็นประเภทใช้งานได้โดยที่การใช้List<String>ไม่ได้ผล
Wim Deblauwe

3
หากคุณต้องการให้ใช้งานได้List<String>แทนคุณString[]ต้องเพิ่ม a อย่างน้อย<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">ในapplicationContext.xmlไฟล์. มิฉะนั้นจะไม่ใช้บริการการแปลง แต่เป็นตัวแก้ไขคุณสมบัติเริ่มต้นซึ่งไม่รองรับการแปลงสตริงเป็นคอลเลกชันเฉพาะอาร์เรย์: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar

37

และในกรณีที่คุณใช้ตัวคั่นอื่นที่ไม่ใช่ลูกน้ำคุณก็สามารถใช้สิ่งนั้นได้เช่นกัน

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

และ

ในคุณสมบัติแอปพลิเคชันของคุณคุณสามารถมีได้

my.config.values=value1, value2, value3

การใช้งานนี้ยังใช้ได้กับคำอธิบายประกอบอื่น ๆ ฉันใช้เช่น @KafkaListener {topic = "# {'$ {ArrayProperty}'. split (',')}"} สำหรับผู้ฟัง spring kafka
AsyncTask

32

นี่คือตัวอย่างวิธีที่คุณสามารถทำได้ในฤดูใบไม้ผลิ 4.0+

application.properties เนื้อหา:

some.key=yes,no,cancel

รหัส Java:

@Autowire
private Environment env;

...

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

นี่คือสิ่งที่ฉันต้องการ แต่ใน env vars ... ฉันควรจะสามารถใช้ SOME_KEY_0_ = ใช่ SOME_KEY_1 = ไม่ใช่ ฯลฯ ใน env vars แต่ getProperty ของฉันกลับมาเป็นโมฆะ
รูบาร์บ

1

ด้วย Spring Boot คุณสามารถทำสิ่งต่อไปนี้:

application.properties

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

คลาสการกำหนดค่า

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ในคลาสก็จะไม่ทำงาน

คลาส 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);
    }

}

0

หากคุณต้องการส่งผ่านสัญลักษณ์ดอกจันคุณต้องปิดด้วยเครื่องหมายคำพูด

ในกรณีของฉันฉันต้องกำหนดค่า cors สำหรับ websockets ดังนั้นฉันจึงตัดสินใจใส่ cors urls ลงใน application.yml สำหรับ prod env ฉันจะใช้ url เฉพาะ แต่สำหรับ dev สามารถใช้แค่ *

ในไฟล์ yml ฉันมี:

websocket:
  cors: "*"

ในคลาส Config ฉันมี:

@Value("${websocket.cors}")
private String[] cors;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.