2011-09-23 13 views
24

कुछ ही खोजों से, यह एक समस्या की तरह लगता है जो थोड़ी देर के आसपास रहा है। मैंने एक FacesConverter लिखा है जो निम्न जैसा दिखता है। ऑब्जेक्ट श्रेणी एक जेपीए इकाई है और श्रेणी नियंत्रण वह डीएओ है जो इसे प्राप्त करता है।एक FacesConverter में सीडीआई इंजेक्शन

@FacesConverter(value = "categoryConverter") 
public class CategoryConverter implements Converter { 

@Inject private CategoryControl cc; 

public CategoryConverter() { } 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    if (cc != null) return cc.getByName(value); 
    System.out.println("CategoryConverter().getAsObject(): no injection!"); 
    return null; 
} 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    if (!(value instanceof Category)) return null; 
    return ((Category) value).getName(); 
} 

} 

जैसा कि आपने शायद अब अनुमान लगाया है, मुझे इंजेक्शन कभी नहीं मिलता है। मैं this page से इस समाधान मिल गया है, जो लगता है कि इस तरह .:

Workaround for this problem: create this method in your localeController: 

public Converter getConverter() 
{ 
    return FacesContext.getCurrentInstance().getApplication().createConverter("localeConverter"); 
} 

and use converter="#{localeController.converter}" in your h:selectOneMenu. 

हालांकि मैं यह काम या तो नहीं कर सकता। मेरी बैकिंग बीन एक कन्वर्टर को सही बनाता है और लौटाता है, लेकिन इसमें ऑब्जेक्ट इंजेक्शन नहीं मिलता है।

मैं MyFaces CODI 1.0.1 का उपयोग कर रहा हूं। वर्तमान ग्लासफ़िश/वेल्ड कंटेनर के साथ। क्या कोई कनवर्टर का उपयोग न करने के लिए पुनः कोड करने से पहले कोई समाधान सुझा सकता है?

उत्तर

53

बदलें

@FacesConverter(value = "categoryConverter") 

द्वारा

@Named 

और प्रयोग

<h:inputSomething converter="#{categoryConverter}" /> 

या

<f:converter binding="#{categoryConverter}" /> 

inste

<h:inputSomething converter="categoryConverter" /> 

या

<f:converter converterId="categoryConverter" /> 

के विज्ञापन वैसे, इसी तरह की समस्या एक @FacesConverter अंदर @EJB लिए मौजूद हैं। हालांकि यह मैन्युअल रूप से जेएनडीआई द्वारा पकड़ने का एक तरीका प्रदान करता है। Communication in JSF 2.0 - Getting an EJB in @FacesConverter and @FacesValidator भी देखें। इस तरह आप @FacesConverter(forClass=Category.class) का उपयोग मैन्युअल रूप से इसे हर बार परिभाषित किए बिना कर सकते हैं। दुर्भाग्य से मैं सिर के शीर्ष से नहीं बता सकता कि सीडीआई बीन्स के लिए इसका एहसास कैसे किया जाए।


अद्यतन: आप, JSF उपयोगिता पुस्तकालय OmniFaces उपयोग करने के लिए होगा अगर के बाद से संस्करण 1.6 है किसी भी अतिरिक्त विन्यास या एनोटेशन के बिना एक @FacesConverter कक्षा में @Inject और @EJB प्रयोग करने के लिए पारदर्शी समर्थन जोड़ता है। the CDI @FacesConverter showcase example भी देखें।

+3

खैर मैं क्षतिग्रस्त हो जाऊंगा। मैंने एक वर्कअराउंड लागू किया जो मूल रूप से कनवर्टर के अंदर से अभिव्यक्ति का मूल्यांकन करने के लिए एप्लिकेशन को कॉल करता है, लेकिन मुझे लगता है कि यह अधिक सुरुचिपूर्ण है। तो मेरे पास एक और सवाल है @ बाल्लूसी - क्या आपने जेएसएफ पर एक पुस्तक लिखी है? – AlanObject

+3

आपका स्वागत है। पुस्तक के रूप में, आप पहले से ही पहले नहीं हैं जिन्होंने यह पूछा ... – BalusC

+0

ठीक है ऐसा नहीं है कि आपको बहुत कुछ लिखना पड़ेगा - बस जो कुछ भी आपने पहले लिखा है उसे संपादित करें। गंभीरता से मैंने एक पुस्तक के लिए रूपरेखा के बारे में सोचा है यदि आप सहयोग में रूचि रखते हैं तो मुझे बताएं। – AlanObject

3

बस अपने @ फेस कनवर्टर के लिए @DDanced का CODI का उपयोग करें Wiki देखें।

जैसे ही कनवर्टर या सत्यापनकर्ता @Advanced के साथ एनोटेटेड होता है, तो @Inject का उपयोग करना संभव है।

2

प्रति BalusC के जवाब here, मैं JSF (requestscoped) जोड़ने का निर्णय लिया कामयाब सेम है कि केवल मेरे एप्लिकेशन में इस समस्या को हल करने के लिए @FacesConverter और कनवर्टर निहित, के बाद से मैं पलायन कर रहा हूँ से JSF कामयाब सेम कामयाब सेम CDI की।

मैंने @FacesConverter के खिलाफ सीओडीआई @ उन्नत की कोशिश की, लेकिन यह बीन इंजेक्ट नहीं करता है।

6

@Inject एनोटेशन केवल सीडीआई प्रबंधित उदाहरणों में काम करता है। यदि आप एक गैर-सीडीआई प्रबंधित उदाहरण (एक जेएसएफ वैलिडेटर या जेएसएफ कनवर्टर की तरह) के अंदर सीडीआई सुविधाओं का उपयोग करना चाहते हैं तो आप केवल सीडीआई एपीआई के खिलाफ प्रोग्राम कर सकते हैं।

यह केवल कम से कम जावा ईई 7 + सीडीआई 1.1 सर्वर में काम करता है।

@FacesValidator("userNameValidator") 
public class UserNameValidator implements Validator { 

    private UserService userService; 

    public UserNameValidator(){ 
     this.userService = CDI.current().select(UserService.class).get(); 
    } 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    .... 
    } 
} 

https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/CDI.html

साथ जावा ईई लोगों में AnnotationHell भूल सभी कोड करने के

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