2012-03-29 9 views
6

yo soy muy nuevo en tanto CDI y JSF, y estoy tratando de convertir un código de RichFaces 4 escaparate para usar CDI en lugar de anotaciones JSF.CDI de repuesto para @ManagedProperty

entiendo que puedo usar para reemplazar @Named @MangedBean y @Inject para reemplazar @ManagedProperty. Pero estoy teniendo algunos problemas. Estoy tratando de convertir el ejemplo de Richfaces Tree específicamente.

he realizado los siguientes cambios y sé que esto no es correcto así que por favor no utilice este:

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

........ 

Luego añade (y no estoy seguro de que esto es necesario):

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

y cambiaron:

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

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

no puedo averiguar la forma correcta para reemplazar @ManagedProperty (value = "# {cd sParser.cdsList} ") usando CDI?

Respuesta

5

Dado que su cdsList no es una clase de frijoles, necesita producer field o producer method para hacerlo inyectable.

Ejemplo de campo productor:

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

Ejemplo de método de productor:

import javax.enterprise.inject.Produces; 

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

Esto funciona si no hay otro método de campo productor o productor que devuelve el mismo tipo de frijol. De lo contrario, hay que introducir un calificador especial para su campo productor de resolver la ambigüedad:

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

con

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

esto parece suponer Jboss y no GlassFish ...? – Thufir

+0

@Thufir Esto es Java EE 6 y debe ejecutarse en todos los servidores compatibles. –

Cuestiones relacionadas