স্ট্রিংগুলির তালিকার জন্য স্প্রিং বুট ইয়ামল কনফিগারেশন


149

আমি প্রয়োগ.আইএমএল ফাইল থেকে স্ট্রিংগুলির একটি অ্যারে লোড করার চেষ্টা করছি। এটি কনফিগারেশন:

ignore:
    filenames:
        - .DS_Store
        - .hg

এই শ্রেণি:

@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();

একই শ্রেণিতে অন্যান্য কনফিগারেশন রয়েছে যা ঠিক জরিমানা করে। আমার ইয়ামল ফাইলটিতে কোনও ট্যাব নেই। তবুও আমি নিম্নলিখিত ব্যতিক্রম পাই:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"

উত্তর:


71

আমার অনুমান , এটি @Value"জটিল" ধরণের সাথে মোকাবেলা করতে পারে না। আপনি এর মতো প্রোপ ক্লাসে যেতে পারেন:

@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
    List<String> filenames
}

দয়া করে নোট করুন: উদাহরণটি সংক্ষিপ্ত রাখতে এই কোডটি গ্রোভি - জাভা নয় ! কীভাবে গ্রহণ করতে হয় তার টিপসের জন্য মন্তব্যগুলি দেখুন।

সম্পূর্ণ উদাহরণটি দেখুন https://github.com/christoph-frick/so-springboot-yaml-string-list


1
আপনি কমা দ্বারা বিচ্ছিন্নভাবে বেঁধে রাখতে পারেন @Value(যতক্ষণ না কোনও রূপান্তরকারী নিবন্ধিত হয়, যা এটি আমার মনে হয় স্প্রিং বুটে থাকবে)।
ডেভ সায়ার

2
এটি স্ট্রিং সেটিংস
তুলছে

1
আমি এটির সাথে কাজ করতে পারিনি @Configuration, তবে @Componentপরিবর্তে ব্যবহারটি কৌশলটি করেছে।
স্টিজন ভ্যান বেল

1
@ ক্রিফ্রিক হ্যাঁ এটিই ছিল আমার একমাত্র পরিবর্তন। উভয় টীকাগুলির উদ্দেশ্যটির দিকে তাকিয়ে, আমি বলব @Componentযে আরও উপযুক্ত: স্ট্যাকওভারফ্লো
প্রশ্নগুলি

2
দেখে মনে হচ্ছে এটি বসন্ত বুট প্রক্রিয়াগুলির সাথে একটি সীমাবদ্ধতা যা টীকা দেয় - github.com/spring-projects/spring-boot/issues/501
wontondon

133

এপ্লিকেশন.আইএমএল এ কমা বিচ্ছিন্ন মান ব্যবহার করুন

ignoreFilenames: .DS_Store, .hg

অ্যাক্সেস জন্য জাভা কোড

@Value("${ignoreFilenames}")    
String[] ignoreFilenames

এটি কাজ করছে;)


আমি আশা করছিলাম যে এটি ড্রপউইজার্ডেও কাজ করবে: '(যদিও ধন্যবাদ!
আরএসটি

1
এটি সেরা উত্তর হওয়া উচিত ছিল।
মোহাম্মদ এলসায়দ

3
আমার নিজের পরীক্ষায় এটি ".ডিএসএস স্টোর, .এইচজি" তবে ".ডিএসএসটোোর", ".এইচজি" - এর পরে "org.yaml.snakeyaml.parser.ParserException: ব্লক ম্যাপিং পার্স করার সময়" ব্যর্থ হয়। সুতরাং আপনি এখানে যা করছেন তা হ'ল সম্পত্তি সরবরাহ করা হচ্ছে একক কমা-বিচ্ছিন্ন স্ট্রিং হিসাবে (যা স্প্রিং তারপরে একটি অ্যারে বা তালিকায় বিভক্ত হয়) ওয়াইএএমএল অ্যারের পরিবর্তে। এটি "কাজ করে" তবে মূল প্রশ্নের উত্তর দেয় না। @ ভ্যালু টিকাশিত শিমের সম্পত্তিতে YAML অ্যারে পার্স করার কোনও উপায় এখনও আমার কাছে নেই।
জিরজিরিকোস

38

বসন্ত বুট ডক্স থেকে https://docs.spring.io/spring-boot/docs/current/references/html/boot-features-ternternal-config.html

ওয়াইএএমএল তালিকাগুলি [সূচী] অনুগামীদের সাথে সম্পত্তি কী হিসাবে উপস্থাপিত হয়, উদাহরণস্বরূপ এই ওয়াইএএমএল:

my:
   servers:
       - dev.bar.com
       - foo.bar.com

এই বৈশিষ্ট্যগুলিতে রূপান্তরিত হবে:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

স্প্রিং ডেটাবাইন্ডার ইউটিলিটিগুলি ব্যবহার করে (যেমনটি @ConfigurationPropertiesহয়) আপনার মতো ধরণের টার্গেট শিমের একটি সম্পত্তি থাকা java.util.Listদরকার এবং আপনাকে একটি সেটার সরবরাহ করতে হবে, বা এটি একটি পরিবর্তনীয় মান দিয়ে শুরু করতে হবে, উদাহরণস্বরূপ এটি আবদ্ধ হবে উপরের বৈশিষ্ট্য। এখানে প্রশ্নের কোডটি কেমন দেখাচ্ছে।

@ConfigurationProperties(prefix="ignore")
public class Filenames {

    private List<String> ignoredFilenames = new ArrayList<String>();

    public List<String> getFilenames() {
        return this.ignoredFilenames;
    }
}

2
এটি কাজ করা উচিত, এটি কাজ করার getXxx()জন্য বিটিডাব্লু প্রয়োজন, এবং অবশ্যই এটি ব্যবহার করবে List, না Set
এরিক ওয়াং

ইয়ামলে অ্যারেলিস্টের মানগুলির তালিকাটি কমা সীমানাঙ্কিত তালিকা হতে পারে। আমার ক্ষেত্রে, আমার অনেক মান রয়েছে, সুতরাং কমপ্যাক্টের তালিকাটি প্রতি লাইনের আইটেমের চেয়ে পরিষ্কার clean উদাহরণস্বরূপ, আপনি সার্ভারগুলি করতে পারেন: dev.bar.com, foo.bar.com
ভায়োলাম্যান

25

আহমেটের উত্তর ছাড়াও আপনি কোমা বিচ্ছিন্ন স্ট্রিং ব্যবহার করে লাইন ব্রেকগুলি যুক্ত করতে পারেন> প্রতীক ।

প্রয়োগ.আইএমএল :

ignoreFilenames: >
  .DS_Store, 
  .hg

জাভা কোড :

@Value("${ignoreFilenames}")    
String[] ignoreFilenames;

আপনার স্ট্রিংগুলিতে আর কোনও কমা (,) না পাওয়া পর্যন্ত এটি কাজ করে।
ভ্যালেন্টিন দেশপা

এটি অ্যারেলিস্ট হিসাবে বৈশিষ্ট্যগুলি পড়তে কাজ করে না। এটি তাদের একক স্ট্রিং হিসাবে পড়ে।
শ্রী লক্ষ্মী

6

আহমেটের উত্তর স্ট্রিং অ্যারেতে কমা দ্বারা পৃথককৃত মানগুলি কীভাবে নির্ধারণ করতে পারে তা সরবরাহ করে।

উপরের কনফিগারেশনটি বিভিন্ন ক্লাসে ব্যবহার করার জন্য আপনাকে এটার জন্য গিটার / সেটটার তৈরি করতে হতে পারে .. তবে আপনি যদি এই কনফিগারেশনটি একবার লোড করতে চান এবং এটি স্বতঃরেখিত টিকা দিয়ে শিম হিসাবে ব্যবহার করতে চান তবে আমি এখানে কীভাবে সম্পাদন করেছি:

কনফিগারপ্রাইডার.জভাতে

@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
    return new ArrayList<String>();
}

বাইরের ক্লাসে:

@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;

আপনি স্বয়ংক্রিয়ায়নের মাধ্যমে অন্য যে কোনও জায়গায় একই তালিকা ব্যবহার করতে পারেন।


ওই কাজগুলো. আমার ক্ষেত্রে যদিও অ্যাপ্লিকেশন ব্যর্থ হয়েছে, যদি না আমি @Configurationক্লাসের শুরুতে যুক্ত করি ConfigProvider.java। অন্যথায় আমি উত্সটি 'জাভা.ইটিল.লিস্ট' টাইপের একটি বিনের সন্ধান পেয়েছি যা পাওয়া যায়নি।
ডায়ানা

3
@Value("#{'${your.elements}'.split(',')}")  
private Set<String> stringSet;

yML ফাইল:

your:
 elements: element1, element2, element3

আরও অনেক কিছু রয়েছে আপনি বসন্ত স্পেলের সাথে খেলতে পারেন।


2

ঠিক আছে, আমি কেবল এটির কাজটি করতে পারি তা হ'ল:

servers: >
    dev.example.com,
    another.example.com

@Value("${servers}")
private String[] array;

এবং আপনার শ্রেণীর উপরে @ কনফিগারেশনটি ভুলে যাবেন না ....

"," বিচ্ছেদ ছাড়া এমন ভাগ্য ...

খুব কাজ করে (1.5.8 সংস্করণ বুট)

servers: 
       dev.example.com,
       another.example.com

-1

আমার ক্ষেত্রে এটি .ML ফাইলটিতে একটি সিনট্যাক্স সমস্যা ছিল। আমার ছিল:

@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;

এবং আমার .ml ফাইলের তালিকা:

bootstrap-servers:
  - s1.company.com:9092
  - s2.company.com:9092
  - s3.company.com:9092

@ মান-টীকাযুক্ত ক্ষেত্রটি পড়ছিল না। আমি যখন জিম ফাইলটিতে সিনট্যাক্স পরিবর্তন করেছি:

bootstrap-servers >
  s1.company.com:9092
  s2.company.com:9092
  s3.company.com:9092

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


বসন্ত-বুট 1.5 এ চেষ্টা করে এটি কার্যকর হয় না। বুটস্ট্র্যাপ-সার্ভারগুলির পরে আপনার একটি কোলন প্রয়োজন
টগজিনিটস

-2
@Value("${your.elements}")    
private String[] elements;

yML ফাইল:

your:
 elements: element1, element2, element3

1
এই ভিন্ন রূপ আহমতের উত্তর কীভাবে? stackoverflow.com/a/41462567/2065796
বিদেশে Shpota

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