jsf 2 सीडीआई और जेएसएफ 2 के साथ डीपीडेंसी इंजेक्ट अनुरोध पैरामीटर



jsf-2 cdi (1)

संकेत: किसी भी आगे पढ़ने से पहले http://showcase.omnifaces.org/components/param पर नजर डालें। क्या यह स्वयं संभवतः अप्रचलित है कि देखिए कि ओम्नीफेस आज वास्तविक मानक है। अगर शायद समय पर यह सब जगहें हों तो मुझे यह नहीं लिखा होगा

सीडीआई विशिष्ट समस्याओं को हल नहीं करता है जैसे कि एक अनुरोध पैरामीटर इंजेक्शन यह एक्सटेंशन द्वारा हल किया जाना चाहिए

यह पहले से ही मिलाप द्वारा प्रदान किया गया है http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html/injectablerefs.html

यह शायद Deltaspike 0.4-incubating या इसी तरह के रूप में अच्छी तरह से शामिल किया जाएगा।

उसने कहा कि कोड की आवश्यकता अपने आप को लागू करने के लिए आसान नहीं है। नीचे दिए गए उदाहरण:

इंजेक्शन बिंदु के लिए उपयोग करने के लिए टिप्पणी (उदाहरण के लिए private String myParam; )

import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER })
public @interface RequestParam {
    @Nonbinding
    public String value() default "";
}

अब हमारे पास एनोटेशन है लेकिन हम केवल कंटेनर को एक @RequestParam इंजेक्ट करने के लिए निर्भरता नहीं पूछ सकते - हमें स्पष्ट रूप से कार्यान्वयन की आवश्यकता है।

import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

public class RequestParamProducer implements Serializable {

    private static final long serialVersionUID = -4260202951977249652L;
    @Inject
    FacesContext facesContext;

    // Producer for @RequestParam
    @Produces
    @RequestParam
    String getRequestParameter(InjectionPoint ip) {
        String name = ip.getAnnotated().getAnnotation(RequestParam.class)
                .value();

        if ("".equals(name))
            name = ip.getMember().getName();

        return facesContext.getExternalContext().getRequestParameterMap()
                .get(name);
    }
}

तो यह कैसे काम करता है? अच्छी तरह से बस यह पहली बार जांचता है कि क्या आपने निर्दिष्ट किया है कि आप @Requestparam("longAndTerribleFieldNameBestToSpecify") रूप में क्या पैरामीटर चाहते थे;

यदि आपने ऐसा नहीं किया है तो यह फ़ील्ड का उपयोग करेगा इसलिए यदि आप setMyInstance नामक एक सेटर नामित हैं तो यह setMyInstance नामक एक पैरामीटर की खोज करेगा।

सामान्य उपयोग के मामले में स्ट्रिंग वेरिएबल होना चाहिए, जो कि आप चाहते पैरामीटर की तरह ठीक है।

ध्यान दें कि हम FacesContext को इंजेक्ट करते हैं, इसका भी उत्पादन करना चाहिए। ए फेससेन्टेक्स्ट निर्माता इस तरह दिख सकता है:

class FacesContextProducer {

   @Produces @RequestScoped FacesContext getFacesContext() {

      return FacesContext.getCurrentInstance();

   }

}

अंतिम उपयोग:

@Inject
@RequestParam
private String session_secret;

ध्यान दें कि यह सर्लेट या समान के लिए काम नहीं करेगा जैसा कि इसके लिए FacesContext तक पहुंच की आवश्यकता है उन मामलों में इंजेक्शन को लपेटने की ज़रूरत होती है उदाहरण के लिए बीन जो @ रिसक्स स्कैड है आप उस बीन को जगह देते हैं

सीडीआई और जेएसएफ 2 का उपयोग करते समय कैसे एक HTTP अनुरोध पैरामीटर बीन में इंजेक्ट किया जा सकता है?





http-request-parameters