मेरे पास एक एप्लिकेशन है जिसे java -jar MyAssembledJarWithAllDep.jar -foo bar जैसे कमांड लाइन के माध्यम से शुरू किया गया है

मैं जकार्ता ई सीडीआई विनिर्देश का उपयोग करने में सक्षम होने के लिए weld.se का उपयोग कर रहा हूं। इसके अलावा मैं कॉमन लाइन तर्कों को पार्स करने के लिए अपाचे क्ली टूल का उपयोग कर रहा हूं।

यहाँ मेरे मावेन आयात हैं:

        <dependency>
            <groupId>jakarta.enterprise</groupId>
            <artifactId>jakarta.enterprise.cdi-api</artifactId>
            <version>3.0.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.jboss.weld.se</groupId>
            <artifactId>weld-se</artifactId>
            <version>2.4.6.Final</version>
        </dependency>

        <dependency>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
            <version>1.4</version>
        </dependency>

इस तरह मैं कंटेनर को इनिशियलाइज़ करता हूँ:

    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        container.select(MyRunnerClass.class).get().run(args);
        container.shutdown();
    }

मैं निम्नलिखित कर सकता था:

public void run(String[] args) {
   CommandLineParser clp = new CommandLineParser(args);
   clp.parse();

लेकिन चूंकि मैं cdi के पूर्ण समर्थन का उपयोग करना चाहता हूं, इसलिए मैं ऑब्जेक्ट नहीं कर सकता क्योंकि मैंने इसे स्वयं बनाया है! तो मैं तर्कों को कंटेनर में कैसे पास करूं ताकि वेल्ड आवश्यक तर्कों के साथ स्वयं CommandLineParser बना सके?

0
Wumba 15 अप्रैल 2021, 17:37

2 जवाब

सबसे बढ़िया उत्तर

मैं अपाचे क्ली टूल्स से परिचित नहीं हूं इसलिए मैं मान रहा हूं कि CommandLineParser अपने आप में बीन नहीं है और आप इसे बीन में बदलना चाहते हैं। उस स्थिति में आपको एक निर्माता विधि प्रदान करने की आवश्यकता होती है जो वस्तु के निर्माण में किसी भी स्थानीय मेटाडेटा का उपयोग कर सके।

निम्नलिखित विधि एक निर्माता विधि है और इसे काम करने के लिए किसी अन्य बीन वर्ग में रखा जाना चाहिए (अधिक विवरण के लिए सीडीआई विनिर्देश देखें):

@Produces
@ApplicationScoped // or any other scope that you want to use for the bean!
public CommandLineParser produceCmdLineParser() {
  String[] args = retrieveArgs(); // grab arguments from your main class or other place
  return new CommandLineParser(args);
}

जब आप मानक या गतिशील इंजेक्शन के माध्यम से CommandLineParser प्रकार के बीन के लिए CDI कंटेनर से पूछते हैं, तो उपरोक्त निर्माता विधि को वेल्ड द्वारा लागू किया जाएगा (इसे मैन्युअल रूप से लागू न करें)।

0
Siliarus 15 अप्रैल 2021, 18:03