2012-03-29 11 views
6

Ich bin sehr neu sowohl CDI und JSF, und ich versuche, etwas Code von Richfaces 4 Showcase zu konvertieren, CDI anstelle von JSF-Annotationen zu verwenden.CDI-Ersatz für @ManagedProperty

Ich verstehe, dass ich @named verwenden kann, um @MangedBean und @Inject zu ersetzen @ManagedProperty ersetzen. Aber ich habe Probleme. Ich versuche, das Richfaces-Tree-Beispiel speziell zu konvertieren.

Ich habe folgende Änderungen vorgenommen und ich weiß, dass dies so nicht korrekt ist bitte diese nicht verwenden:

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

........ 

Dann habe ich (und ich bin nicht sicher, ob dies erforderlich ist):

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

und geändert:

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

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

ich kann nicht die richtige Art und Weise herauszufinden, @ManagedProperty zu ersetzen (value = „# {cd sParser.cdsList} ") mit CDI?

Antwort

5

Da Ihre cdsList keine Bohnenklasse ist, benötigen Sie eine producer field oder eine producer method, um es injizierbar zu machen.

Beispiel für Hersteller Feld:

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

Beispiel für Hersteller Methode:

import javax.enterprise.inject.Produces; 

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

Dies funktioniert, wenn es keine andere Hersteller Feld oder Producer-Methode ist, die den gleichen Bean-Typen zurückzugibt. Ansonsten benötigen Sie eine spezielle Qualifikation für Ihr Produzent Feld einzuführen Mehrdeutigkeit aufzulösen:

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

mit

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

dies scheint Jboss zu übernehmen und nicht ... Glassfish? – Thufir

+0

@Thufir Dies ist Java EE 6 und sollte auf allen kompatiblen Servern ausgeführt werden. –