2012-03-29 22 views
6

के लिए सीडीआई प्रतिस्थापन मैं सीडीआई और जेएसएफ दोनों के लिए बहुत नया हूं, और मैं जेएसएफ एनोटेशन के बजाय सीडीआई का उपयोग करने के लिए रिचफैस 4 शोकेस से कुछ कोड बदलने की कोशिश कर रहा हूं।@ManagedProperty

मैं समझता हूं कि मैं @MangedBean को बदलने के लिए @Mamed का उपयोग कर सकता हूं और @ManagedProperty को बदलने के लिए @Inject। लेकिन मुझे कुछ परेशानी हो रही है। मैं विशेष रूप से Richfaces वृक्ष उदाहरण को बदलने की कोशिश कर रहा हूँ।

//@ManagedBean 
//@ViewScoped 
@Named 
@SessionScoped 
public class TreeBean implements Serializable { 
    private static final long serialVersionUID = 1L; 
// @ManagedProperty(value = "#{cdsParser.cdsList}") 
// private List<CDXmlDescriptor> cdXmlDescriptors; 
    @Inject 
    private Instance<CDXmlDescriptor> cdXmlDescriptors; 
// I also Tried : 
// @Inject 
// private CDParser cdsParser; 
// private List<CDXmlDescriptor> cdXmlDescriptors = cdsParser.getCdsList(); 

........ 

तब मैं जोड़ दिया था (और मुझे यकीन है कि यह आवश्यक हो नहीं कर रहा हूँ):

मैं निम्नलिखित परिवर्तन किए हैं और मुझे पता है यह तो यह उपयोग नहीं करें सही नहीं है

@Named 
@SessionScoped 
public class CDXmlDescriptor implements Serializable { ... 

और बदल दिया है:

//@ManagedBean(name = "cdsParser") 
@Named("CDParser") 
//@Named 
@SessionScoped 
public class CDParser implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 3890828719623315368L; 
    @Named 
    private List<CDXmlDescriptor> cdsList; 

मैं @ManagedProperty को बदलने के लिए उचित तरीके को समझ नहीं सकता (value = "# {सीडी sParser.cdsList} ") सीडीआई का उपयोग कर?

उत्तर

5

चूंकि आपके cdsList कोई बीन क्लास नहीं है, इसलिए इसे इंजेक्शन करने के लिए आपको producer field या producer method की आवश्यकता है। निर्माता क्षेत्र के लिए

उदाहरण: निर्माता विधि के लिए

import javax.enterprise.inject.Produces; 
... 
@Named 
@Produces 
private List<CDXmlDescriptor> cdsList; 

उदाहरण:

import javax.enterprise.inject.Produces; 

private List <CDXmlDescriptor> cdsList; 
... 
@Named("cdsList") 
@Produces 
public List<CDXmlDescriptor> getCdsList { 
    return cdsList; 
}; 

यह काम करता है, अगर वहाँ कोई अन्य निर्माता क्षेत्र या निर्माता विधि है कि एक ही सेम प्रकार देता है। नहीं तो आप समाधान के लिए अपने निर्माता क्षेत्र के लिए एक विशेष क्वालीफायर शुरू करने की जरूरत है अस्पष्टता:

import static java.lang.annotation.ElementType.TYPE; 
import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.PARAMETER; 
import static java.lang.annotation.ElementType.METHOD; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 
import javax.inject.Qualifier; 


@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface CdsList { 
} 

साथ

@Named @Produces @CdsList 
private List<CDXmlDescriptor> cdsList; 
+0

इस Jboss ग्रहण करने के लिए और ग्लासफिश नहीं लगता है ...? – Thufir

+0

@ थफिर यह जावा ईई 6 है और सभी अनुपालन सर्वरों पर चलना चाहिए। –