বৈশিষ্ট্য ফাইল থেকে একটি তালিকা পড়া এবং স্প্রিং টীকা @ ভ্যালু সহ লোড করা


244

আমি একটি .poperties ফাইলে মানগুলির একটি তালিকা রাখতে চাই, অর্থাত:

my.list.of.strings=ABC,CDE,EFG

এবং এটি সরাসরি আমার ক্লাসে লোড করার জন্য, যেমন:

@Value("${my.list.of.strings}")
private List<String> myList;

আমি যেমন বুঝতে পেরেছি, এটি করার একটি বিকল্প হ'ল এটি বসন্তের কনফিগারেশনের ফাইলটিতে থাকা এবং এটি একটি বিনের রেফারেন্স হিসাবে লোড করা (আমি ভুল হলে আমাকে সংশোধন করুন), অর্থাৎ

<bean name="list">
 <list>
  <value>ABC</value>
  <value>CDE</value>
  <value>EFG</value>
 </list>
</bean>

তবে এটি করার কোনও উপায় আছে কি? একটি .properties ফাইল ব্যবহার করছেন? PS: আমি যদি সম্ভব হয় তবে কোনও কাস্টম কোড দিয়ে এটি করতে চাই।

উত্তর:


454

স্প্রিং ইএল ব্যবহার:

@Value("#{'${my.list.of.strings}'.split(',')}") 
private List<String> myList;

আপনার বৈশিষ্ট্য ফাইলটি নিম্নলিখিতগুলির সাথে সঠিকভাবে লোড হয়েছে বলে ধরে নেওয়া হচ্ছে:

my.list.of.strings=ABC,CDE,EFG

1
আপনি যে একই সংস্করণ ব্যবহার করছেন তা ব্যবহার করে আমি এটি আবার চেক করেছি। পোস্টে ঠিক ঠিক তেমন স্প্রিং ইএল অনুলিপি করেছেন এবং এটি কাজ করে। যদিও আমার ইএলটিতে ত্রুটি করি আমি তার org.springframework.expression.spel.SpelEvaluationExceptionব্যতিক্রম পাই এবং না হলেও এটির চেয়ে আলাদা javax.el.ELException। আপনার আপত্তি বসন্ত দ্বারা নির্মিত?
উইলহেলম ক্লেউ

1
স্প্রিং ৩.২ এর সাথে পুরোপুরি কাজ করে।
এহসানউল্লাহজান

17
কিভাবে খালি সম্পত্তি সম্পর্কে my.list.of.strings=? আমি এই ধরনের কার্যকারিতা খালি তালিকার পুনরায় পুনরায় সংস্থান করার আশা করব যেখানে এটি একটি আইটেম (খালি স্ট্রিং) হবে, তাই না?
জান জাইকা

5
এছাড়াও মনে রাখবেন যে প্রস্তাবিত সমাধানটি ছাঁটাই করে না তাই এর মতো মানগুলি item1, item2, item3আপনাকে ফল দেয় যা আপনি সত্যই প্রত্যাশা করেন না (ইঙ্গিত: ফাঁকা স্থান)।
জান জাইকা

4
আপনার যদি ফাঁকা স্থানগুলি ছাঁটাই করতে হয় তবে বিভক্ত যুক্তির জন্য @Value("#{'${my.list.of.strings}'.split(',\\s*')}")
রেজেস

88

বসন্ত 3.0.০ থেকে আপনি এর মতো একটি লাইন যুক্ত করতে পারেন

<bean id="conversionService" 
    class="org.springframework.context.support.ConversionServiceFactoryBean" />

আপনার applicationContext.xml(বা যেখানে আপনি জিনিসগুলি কনফিগার করেন) তে যান। দিমিত্রি চর্নি একটি মন্তব্যে যেমন উল্লেখ করেছেন, জাভা ভিত্তিক কনফিগারেশন দেখে মনে হচ্ছে:

@Bean public ConversionService conversionService() {
    return new DefaultConversionService();
}

এই নতুন কনফিগারেশন পরিষেবা যা রূপান্তর সমর্থন সক্রিয় Stringকরার Collectionধরনের। যদি আপনি এই কনফিগারেশন পরিষেবাটি সক্রিয় না করেন, তবে স্প্রিং তার উত্তরাধিকার সম্পত্তি সম্পাদকদের উপর কনফিগারেশন পরিষেবা হিসাবে ফিরে আসে, যা এই ধরণের রূপান্তরকে সমর্থন করে না।

অন্যান্য ধরণের কাজগুলির সংগ্রহগুলিতে রূপান্তর করাও:

@Value("${my.list.of.ints}")
private List<Integer> myList

মত একটি লাইন সঙ্গে কাজ করবে

 my.list.of.ints= 1, 2, 3, 4

হোয়াইটস্পেসে কোনও সমস্যা নেই, ConversionServiceFactoryBeanএটির যত্ন নেয়।

দেখুন http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config

একটি স্প্রিং অ্যাপ্লিকেশনে, আপনি সাধারণত স্প্রিং কন্টেইনার (বা অ্যাপ্লিকেশন কনটেক্সট) হিসাবে একটি রূপান্তর পরিষেবাদির উদাহরণটি কনফিগার করেন। সেই রূপান্তর পরিষেবাটি বসন্তের দ্বারা বাছাই করা হবে এবং তারপরে ফ্রেমওয়ার্কের মাধ্যমে যখনই কোনও ধরণের রূপান্তর সম্পাদনের প্রয়োজন হবে তখনই তা ব্যবহার করা হবে। [...] যদি কোনও রূপান্তর পরিষেবাদি স্প্রিংয়ের সাথে নিবন্ধিত না হয় তবে আসল সম্পত্তি অ্যাডিটর-ভিত্তিক সিস্টেমটি ব্যবহৃত হয়।


6
জাভা কনফিগারেশন: @ বিয়ান পাবলিক কনভার্সন সার্ভিস রূপান্তর পরিষেবা () new নতুন ডিফল্ট রূপান্তরকরণ পরিষেবা () ফিরিয়ে দিন; }
দিমিত্রি চর্নি

2
split()প্রতিটি অভিব্যক্তি দিয়ে নিজেকে পুনরাবৃত্তি করা এড়ানো ছাড়াও, এটি আপনাকে দেওয়ার পরিবর্তে খালি তালিকাটি সঠিকভাবে পরিচালনা করে[null]
দিদিয়ার এল

সম্পত্তিটি ওভাররাইড করা থাকলে এটি কাজ করছে না (একাধিক সম্পত্তির উত্সে রয়েছে))
ড্যানিয়েল হুরি

47

আপনি যদি এটি পড়ছেন এবং আপনি স্প্রিং বুট ব্যবহার করছেন তবে এই বৈশিষ্ট্যের জন্য আপনার কাছে আরও 1 টি বিকল্প রয়েছে

সাধারণত কমা দ্বারা পৃথক করা তালিকা বাস্তব বিশ্বের ব্যবহারের ক্ষেত্রে অত্যন্ত আনাড়ি হয়ে থাকে (এবং আপনি যদি আপনার কনফিগারেশনে কমা ব্যবহার করতে চান তবে কখনও কখনও এটি সম্ভবও হয় না):

email.sendTo=somebody@example.com,somebody2@example.com,somebody3@example.com,.....

সঙ্গে স্প্রিং বুট , আপনি এটি এই মত লিখতে পারেন (INDEX 0 এ শুরু):

email.sendTo[0]=somebody@example.com
email.sendTo[1]=somebody2@example.com
email.sendTo[2]=somebody3@example.com

এবং এটি এর মতো ব্যবহার করুন:

@Component
@ConfigurationProperties("email")
public class EmailProperties {

    private List<String> sendTo;

    public List<String> getSendTo() {
        return sendTo;
    }

    public void setSendTo(List<String> sendTo) {
        this.sendTo = sendTo;
    }

}


@Component
public class EmailModel {

  @Autowired
  private EmailProperties emailProperties;

  //Use the sendTo List by 
  //emailProperties.getSendTo()

}



@Configuration
public class YourConfiguration {
    @Bean
  public EmailProperties emailProperties(){
        return new EmailProperties();
  }

}


#Put this in src/main/resource/META-INF/spring.factories
  org.springframework.boot.autoconfigure.EnableAutoConfiguration=example.compackage.YourConfiguration

আমার এখানে সমস্যা আছে যেখানে পালিত কমা স্বীকৃত না হওয়ার কারণে এখানে বর্ণিত অন্যান্য সমাধানগুলি কাজ করে না। স্প্রিং 4 এর সাথে এই সমাধান করার কোনও উপায় আছে কি?
স্যান্ডরোজবিন্দেন

34

my.list.of.strings=ABC,CDE,EFGইনপ্রোপার্টি ফাইল নির্দিষ্ট করে এবং ব্যবহার করে

@Value("${my.list.of.strings}") private String[] myString;

আপনি স্ট্রিং এর অ্যারে পেতে পারেন। এবং ব্যবহার করে CollectionUtils.addAll(myList, myString), আপনি স্ট্রিংয়ের তালিকা পেতে পারেন।


আমি কেবল প্রথম স্ট্রিং "এবিসি" পাই
ওসামা আবদুলসত্তার

19

আপনি কি @Autowiredকনস্ট্রাক্টর বা একটি সেটার এবং String.split()শরীরে প্রবেশের বিষয়টি বিবেচনা করেছেন ?

class MyClass {
    private List<String> myList;

    @Autowired
    public MyClass(@Value("${my.list.of.strings}") final String strs) {
        myList = Arrays.asList(strs.split(","));
    }

    //or

    @Autowired
    public void setMyList(@Value("${my.list.of.strings}") final String strs) {
        myList = Arrays.asList(strs.split(","));
    }
}

আমি আমার কোডের টেস্টিবিলিটি বাড়াতে এই উপায়গুলির মধ্যে একটিতে আমার অটোওয়্যারিং করা পছন্দ করি।


14

আপনি যদি স্প্রিং বুট 2 ব্যবহার করেন তবে এটি কোনও অতিরিক্ত কনফিগারেশন ছাড়াই যেমন কাজ করে।

my.list.of.strings=ABC,CDE,EFG

@Value("${my.list.of.strings}")
private List<String> myList;

আমার জন্য কাজ করেনি, উপরের মত আমাকে স্প্রিং EL ব্যবহার করতে হবে।
বিলবো ব্যাগিনস

বা এমনকিprivate List<String> myList;
হালায়ম আনিস

হ্যাঁ এটি আমার জন্যও কাজ করেছিল: আমি স্প্রিং বুট ২.২.। ব্যবহার করছি
অঙ্কিত

8

উপরের সমস্ত উত্তর সঠিক। তবে আপনি এটি কেবল একটি লাইনে অর্জন করতে পারেন। দয়া করে ঘোষণাপত্র অনুসরণ করার চেষ্টা করুন এবং আপনি স্ট্রিং তালিকায় সমস্ত কমা বিভাজিত মান পাবেন।

private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List<String> myList;

এবং আপনার এক্সএমএল কনফিগারেশনে আপনার নীচের লাইনটি সংজ্ঞায়িত করতে হবে।

<util:properties id="projectProperties" location="/project.properties"/>

কেবল আপনার সম্পত্তি ফাইলের পথ এবং ফাইলের নাম প্রতিস্থাপন করুন। এবং আপনি যেতে ভাল। :)

আশা করি এটি আপনাকে সহায়তা করবে। চিয়ার্স।


1
এটি আমার পক্ষে কাজ করেছে, তবে আমার কাছে এটিকে টীকাগুলির মতো করে বলতে হয়েছিল:@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
স্টিভেন

6

যদি আপনি সর্বশেষ স্প্রিং ফ্রেমওয়ার্ক সংস্করণ (স্প্রিং ৩.১++ আমি বিশ্বাস করি) ব্যবহার করে থাকেন তবে আপনার স্প্রিংএল-এ স্ট্রিং বিভক্ত জিনিসগুলির দরকার নেই,

আপনার স্প্রিংয়ের কনফিগারেশন ক্লাসে (কনফিগারেশনের সাথে টীকাযুক্ত এক) উদাহরণস্বরূপ প্রপার্টিসোর্সপ্লেসহোল্ডার কনফিগার এবং ডিফল্ট কনভার্সন সার্ভিস যুক্ত করুন, যেমন,

@Configuration
public class AppConfiguration {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean public ConversionService conversionService() {
        return new DefaultConversionService();
    }
}

এবং আপনার ক্লাসে

@Value("${list}")
private List<String> list;

এবং বৈশিষ্ট্য ফাইল

list=A,B,C,D,E

ডিফল্ট কনভার্সন সার্ভিস ব্যতীত, আপনি যখন নিজের ক্ষেত্রের মানটি ইনজেক্ট করেন কেবল তখনই স্ট্রিং অ্যারেতে আলাদা করা কমা আলাদা স্ট্রিং নিতে পারেন, তবে ডিফল্ট রূপান্তরকরণ পরিষেবা আপনার জন্য কিছু সুবিধাজনক যাদু করে এবং সেগুলি সংগ্রহ, অ্যারে ইত্যাদিতে যুক্ত করবে (আপনি যদি বাস্তবায়ন পরীক্ষা করেন তবে পরীক্ষা করুন এটি সম্পর্কে আরও জানতে চান)

এই দুটি দিয়ে, এটি এমনকি নিউলাইন সহ সমস্ত অনর্থক শ্বেতস্পেসগুলি পরিচালনা করে, তাই এগুলি ছাঁটাতে আপনাকে অতিরিক্ত যুক্তি যুক্ত করার প্রয়োজন হবে না।


এই কনফিগারেশনটি যুক্ত করা কাজ করছে তবে কিছু অদ্ভুত ঘটনা ঘটে: আমি ফাইলের ধরণের জন্য @ ভ্যালু ব্যবহার করতে পারি না, আমার অবশ্যই ফাইলটি রিসোর্স দিয়ে পরিবর্তন করতে হবে।
ad3luc

2

আপনি এটির মতো টিকা দিয়ে এটি করতে পারেন

 @Value("#{T(java.util.Arrays).asList('${my.list.of.strings:a,b,c}')}") 
    private List<String> mylist;

এখানে my.list.of.strings বৈশিষ্ট্য ফাইল থেকে নেওয়া হবে, যদি তা না থাকে, তবে ডিফল্ট a, b, c ব্যবহার করা হবে

এবং আপনার বৈশিষ্ট্য ফাইলে আপনি এরকম কিছু পেতে পারেন

my.list.of.strings = D, E, F


2

মানগুলিতে ফাঁকা স্থান থেকে সাবধান থাকুন। আমি ভুল হতে পারি, তবে আমার মনে হয় কমা-বিচ্ছিন্ন তালিকার ফাঁকা স্থানগুলি @ ভ্যালু এবং স্পেল ব্যবহার করে কেটে দেওয়া হয়নি। ক্রমতালিকা

foobar=a, b, c

স্ট্রিংগুলির তালিকা হিসাবে পড়তে হবে

"a", " b", " c"

বেশিরভাগ ক্ষেত্রে আপনি সম্ভবত স্থানগুলি চাইবেন না!

অভিব্যক্তি

@Value("#{'${foobar}'.trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")
private List<String> foobarList;

আপনাকে স্ট্রিংগুলির একটি তালিকা দেবে:

"a", "b", "c".

নিয়মিত অভিব্যক্তি কমা এর ঠিক আগে এবং ঠিক পরে সমস্ত স্থান সরিয়ে দেয়। মানগুলির ভিতরে থাকা স্পেসগুলি সরানো হয় না। সুতরাং

foobar = AA, B B, CCC

মান হওয়া উচিত

"AA", "B B", "CCC".

বিভক্ত () পদ্ধতিটি অভ্যন্তরীণভাবে রেজেক্সকে ডিলিমিটার হিসাবে ব্যবহার করে, যাতে আপনার উদাহরণটি আরও সহজ করা যায়: <br/>@Value("#{'${foobar}'.trim().split( *, *)}")
কার্লিক_বি

2

আমি মনে করি অ্যারে ধরার জন্য এবং জায়গা ফাঁকা করার জন্য এটি সহজ:

@Value("#{'${my.array}'.replace(' ', '').split(',')}")
private List<String> array;

2

আমার পূর্ণসংখ্যার তালিকার একটি ক্ষেত্রে এটি কাজ করে:

@Value("#{${my.list.of.integers}}")
private List<Integer> listOfIntegers;

সম্পত্তি ফাইল:

my.list.of.integers={100,200,300,400,999}

বা @ ভ্যালু ("# {$। my.set.of.integers}}") ব্যক্তিগত সেট <Integer> setOfIntegers;
আলেক্সি সিমোনভ

1

Commons কনফিগারেশন ব্যবহার বিবেচনা করুন। এটি বৈশিষ্ট্যটিতে অ্যারে / তালিকায় প্রোপার্টি ফাইলগুলিতে একটি এন্ট্রি ভাঙ্গার জন্য তৈরি করেছে। স্পেল এবং @ ভ্যালুর সাথে কম্বিংয়ের মাধ্যমে আপনার যা চাওয়া উচিত তা দেওয়া উচিত


অনুরোধ হিসাবে, আপনার যা প্রয়োজন তা এখানে (সত্যিকার অর্থে কোডটি চেষ্টা করা হয়নি, কিছু টাইপ পেতে পারে, দয়া করে আমার সাথে সহ্য করুন):

অ্যাপাচি কমন্স কনফিগারেশনে রয়েছে প্রোপার্টি কনফিগারেশন। এটি সীমানাযুক্ত স্ট্রিংটিকে অ্যারে / তালিকায় রূপান্তর করার বৈশিষ্ট্যটিকে সমর্থন করে।

উদাহরণস্বরূপ, যদি আপনার কোনও সম্পত্তি ফাইল থাকে

#Foo.properties
foo=bar1, bar2, bar3

নীচের কোড সহ:

PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties");
String[] values = config.getStringArray("foo");

আপনাকে একটি স্ট্রিং অ্যারে দেবে ["bar1", "bar2", "bar3"]

স্প্রিংয়ের সাথে ব্যবহার করতে, এটি আপনার অ্যাপ্লিকেশন প্রসঙ্গে xml:

<bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration">
    <constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/>
</bean>

এবং এটি আপনার বসন্ত শিমের মধ্যে রাখুন:

public class SomeBean {

    @Value("fooConfig.getStringArray('foo')")
    private String[] fooArray;
}

আমি বিশ্বাস করি এটি কাজ করা উচিত: পি


আপনি কীভাবে ব্যবহারের পদ্ধতি এবং ক্লাস সম্পর্কে আরও সুনির্দিষ্ট হতে পারেন এবং প্রকৃত নমুনা কোড স্নিপলেট দুর্দান্ত হবে।
জ্যাকডেভ

1

আমার পছন্দের উপায় (বিশেষত স্ট্রিংগুলির জন্য), নিম্নলিখিতটি:

admin.user={'Doe, John','Headroom, Max','Mouse, Micky'}

আর ব্যবহার করুন

@Value("#{${admin.user}}")
private List<String> userList;

এইভাবে, আপনি আপনার প্যারামিটারে কমাও অন্তর্ভুক্ত করতে পারেন। এটি সেটের ক্ষেত্রেও কাজ করে।


0

যদি সম্পত্তি স্থানধারক ব্যবহার করে থাকেন তবে ser1702544 উদাহরণ হয়ে যাবে

@Value("#{myConfigProperties['myproperty'].trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}") 

স্থানধারক xML সহ:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   
    <property name="properties" ref="myConfigProperties" />
    <property name="placeholderPrefix"><value>$myConfigProperties{</value></property>
</bean>    

<bean id="myConfigProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
     <property name="locations">
         <list>
                <value>classpath:myprops.properties</value>
         </list>
     </property>
</bean> 

0

আমি স্প্রিং বুট ২.২.। ব্যবহার করছি

আমার সম্পত্তি ফাইল:

usa.big.banks= JP Morgan, Wells Fargo, Citigroup, Morgan Stanley, Goldman Sachs

আমার কোড:

@Value("${usa.big.banks}")
    private List<String> bigBanks;

@RequestMapping("/bigbanks")
    public String getBanks() {
        System.out.println("bigBanks = " + bigBanks);
        return bigBanks.toString();
    }

এটা ভাল কাজ করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.