2012-03-29 18 views
6

Jestem bardzo nowy zarówno dla CDI, jak i JSF, i próbuję przekonwertować kod z prezentacji Richfaces 4, aby użyć CDI zamiast adnotacji JSF.Zastępowanie CDI dla @ManagedProperty

Rozumiem, że mogę użyć @Named do zastąpienia @MangedBean i @Inject w celu zastąpienia @ManagedProperty. Ale mam kłopoty. Próbuję specjalnie przekonwertować przykład drzewa Richfaces.

Mam dokonała następujących zmian i wiem, że to nie jest poprawna, więc proszę nie używać tego:

//@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(); 

........ 

Potem dodał (a nie jestem pewien, że to jest potrzebne):

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

i zmianie:

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

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

nie mogę dowiedzieć się właściwy sposób zastąpić @ManagedProperty (value = „# {cd sParser.cdsList} ") używając CDI?

Odpowiedz

5

Ponieważ Twoja nie jest klasą ziarnistą, potrzebujesz producer field lub producer method, aby mogła być wstrzykiwana.

Przykład dziedzinie producent:

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

Przykład sposób producent:

import javax.enterprise.inject.Produces; 

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

ten pracuje, gdy nie ma żadnego innego sposobu pola lub producenci która zwraca samego typu fasoli. W przeciwnym razie trzeba wprowadzić specjalny kwalifikator dla danej dziedzinie producenta rozwiązać dwuznaczność:

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 { 
} 

z

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

to wydaje się zakładać, JBoss i nie GlassFish ...? – Thufir

+0

@Thufir Jest to Java EE 6 i powinien działać na wszystkich zgodnych serwerach. –