6

का उपयोग कर इंजेक्शन मैं जावा ईई 6 का उपयोग कर रहा है और एक ".properties" फ़ाइल से विन्यास लोड करने के लिए की जरूरत है। निर्भरता इंजेक्शन का उपयोग कर विन्यास फाइल से मूल्यों को लोड करने के लिए एक अनुशंसित तरीका (सर्वोत्तम अभ्यास) है? मुझे वसंत में इसके लिए एनोटेशन मिला, लेकिन मुझे जावा ईई के लिए "मानक" एनोटेशन नहीं मिला है।निर्भरता ".properties" फ़ाइल

यह आदमी खरोंच से एक समाधान का विकास किया है:

http://weblogs.java.net/blog/jjviana/archive/2010/05/18/applicaction-configuration-java-ee-6-using-cdi-simple-example

"मैं कैसे विन्यास को पढ़ कर CDI के साथ अपने आवेदन कॉन्फ़िगर करने के लिए एक सरल उदाहरण एक फ़ाइल से गुण नहीं मिला। .. "

लेकिन मुझे आश्चर्य है कि अगर वहाँ के बजाय एक विन्यास कारखाना बनाने का एक और अधिक मानक तरीका है ...

उत्तर

1

भले ही यह वास्तव में अपने प्रश्न, वेल्ड दस्तावेज की this part कवर नहीं करता है आप के लिए ब्याज की हो सकती है।

इस उल्लेख करने के बाद - नहीं, मनमाने ढंग से संसाधनों/संसाधन फ़ाइलों इंजेक्षन करने के लिए कोई मानक तरीका है। मुझे लगता है कि यह इतनी अत्यधिक कस्टम-निर्भर आवश्यकता को मानकीकृत करने के लिए एक विशिष्टता के दायरे से बाहर है (वसंत कोई विनिर्देश नहीं है, वे जो भी उन्हें पसंद कर सकते हैं उन्हें लागू कर सकते हैं)। हालांकि, सीडीआई क्या प्रदान करता है एक तरफ कॉन्फ़िगरेशन होल्डिंग बीन्स इंजेक्ट करने के लिए एक मजबूत (उर्फ टाइपएफ़) तंत्र है, और दूसरी तरफ ऐसे बीन्स पढ़ने और बनाने के लिए एक लचीली निर्माता तंत्र है। निश्चित रूप से यह अनुशंसित तरीका है जिसके बारे में आप पूछ रहे थे।

दृष्टिकोण आप के लिए लिंक कर रहे हैं निश्चित रूप से एक बहुत अच्छी है - हालांकि यह मुझे भी अपनी आवश्यकताओं के लिए बहुत, गुण आप इंजेक्षन की योजना बना रहे के प्रकार पर निर्भर हो सकता है।

एक जारी रखने की बहुत CDI-इश तरह से एक CDI विस्तार (कि अच्छी तरह से सभी आवश्यक वर्गों को संपुटित हैं) को विकसित करने और यह स्वतंत्र रूप से तैनात अपनी परियोजनाओं के साथ होगा। बेशक आप CDI-extension catalog या यहां तक ​​कि Apache Deltaspike में भी योगदान कर सकते हैं।

+0

"स्प्रिंग कोई विनिर्देश है, वे बस कर सकते हैं जो भी उन्हें पसंद है लागू करें "- हाँ, लेकिन विशिष्टता स्वर्ग से नहीं आते हैं। किसी ने लिखा है, जैसे किसी ने स्प्रिंग लिखा है। –

1

यह कर एक nonbinding एनोटेशन के सदस्य के साथ एक क्वालीफायर उपयोग करने के लिए, और सुनिश्चित करें कि आपके इंजेक्शन के सभी निर्भर scoped कर रहे हैं हो सकता है की केवल "मानक" जिस तरह से। फिर आपके निर्माता में आप इंजेक्शनपॉइंट को पकड़ सकते हैं और इंजेक्शन पॉइंट में क्वालीफायर से कुंजी प्राप्त कर सकते हैं। आप कुछ इस तरह चाहते हैं:

@Qualifier 
public @interface Property { 
    @Nonbinding String value default ""; 
} 

... 
@Inject @Property("myKey") String myKey; 


... 
@Produces @Property public String getPropertyByKey(InjectionPoint ip) { 
    Set<Annotation> qualifiers = ip.getQualifiers 

    // Loop through qualifers looking for Property.class save that off 
    return ResourceBundle.getBundle(...).getString(property.key); 
} 

वहाँ स्पष्ट रूप से कर रहे हैं आपको कुछ एन्हांसमेंट कि कोड के लिए कर सकते हैं, लेकिन यह आप सही रास्ते नीचे शुरू करने के लिए पर्याप्त होना चाहिए।

3

विन्यास एनोटेशन के @ConfigProperty

package com.ubiteck.cdi; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import javax.enterprise.util.Nonbinding; 
import javax.inject.Qualifier; 

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
public @interface InjectedConfiguration { 
    /** 
    * Bundle key 
    * @return a valid bundle key or "" 
    */ 
    @Nonbinding String key() default ""; 
    /** 
    * Is it a mandatory property 
    * @return true if mandator 
    */ 
    @Nonbinding boolean mandatory() default false; 
    /** 
    * Default value if not provided 
    * @return default value or "" 
    */ 
    @Nonbinding String defaultValue() default ""; 
} 

विन्यास कारखाना कैसा दिखाई:

import java.text.MessageFormat; 
import java.util.MissingResourceException; 
import java.util.ResourceBundle; 
import javax.enterprise.inject.Produces; 
import javax.enterprise.inject.spi.InjectionPoint; 

public class ConfigurationInjectionManager { 
    static final String INVALID_KEY="Invalid key '{0}'"; 
    static final String MANDATORY_PARAM_MISSING = "No definition found for a mandatory configuration parameter : '{0}'"; 
    private final String BUNDLE_FILE_NAME = "configuration"; 
    private final ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_FILE_NAME); 

    @Produces 
    @InjectedConfiguration 
    public String injectConfiguration(InjectionPoint ip) throws IllegalStateException { 
     InjectedConfiguration param = ip.getAnnotated().getAnnotation(InjectedConfiguration.class); 
     if (param.key() == null || param.key().length() == 0) { 
      return param.defaultValue(); 
     } 
     String value; 
     try { 
      value = bundle.getString(param.key()); 
      if (value == null || value.trim().length() == 0) { 
       if (param.mandatory()) 
        throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()})); 
       else 
        return param.defaultValue(); 
      } 
      return value;    
     } catch (MissingResourceException e) { 
      if (param.mandatory()) throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()})); 
      return MessageFormat.format(INVALID_KEY, new Object[]{param.key()}); 
     } 
    } 

Tutorial with explanation and Arquillian test

+0

धन्यवाद! हम प्रोग्रामिक रूप से BUNDLE_FILE_NAME को यहां कैसे बदल सकते हैं? उदाहरण के लिए प्रोग्राम ए ए "ए.प्रोपरीज" और प्रोग्राम बी "बी का उपयोग कर सकता है।गुण "लेकिन इस कोड को साझा करना चाहते हैं। –

+0

आप इंजेक्शन वाली फ़ाइल को कैसे परिभाषित करते हैं? और यह कहां से पढ़ता है? – f1wade

संबंधित मुद्दे