9 votes

Remplacement du CDI pour @ManagedProperty

J'essaie de convertir du code de la vitrine Richfaces 4 pour utiliser CDI au lieu des annotations JSF.

Je comprends que je peux utiliser @Named pour remplacer @MangedBean y @Inject pour remplacer @ManagedProperty . Mais je rencontre des difficultés. J'essaie de convertir l'exemple RichFaces Tree en particulier.

J'ai apporté les modifications suivantes et je sais que ce n'est pas correct, alors ne l'utilisez pas :

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

........

J'ai ensuite ajouté (et je ne suis pas sûr que cela soit nécessaire) :

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

et a changé :

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

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

Je n'arrive pas à trouver la bonne façon de remplacer @ManagedProperty(value = "#{cdsParser.cdsList}") en utilisant le CDI ?

11voto

Matt Handy Points 19128

Avec JSF 2.3+, vous pouvez utiliser javax.faces.annotation.ManagedProperty pour cela. Il fonctionne de la même manière que l'ancien et depuis que JSF 2.3 est déprécié javax.faces.bean.ManagedProperty il suffit d'ajouter @Inject à elle.

Exemple :

import javax.faces.annotation.ManagedProperty;
...
@Inject
@ManagedProperty(value = "#{cdsParser.cdsList}")
private List<CDXmlDescriptor> cdXmlDescriptors;

Si vous n'utilisez pas encore JSF 2.3+, vous avez besoin d'un fichier domaine de la production ou un méthode du producteur pour le rendre injectable.

Exemple pour le champ producteur :

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

Exemple de méthode pour les producteurs :

import javax.enterprise.inject.Produces;

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

Cela fonctionne s'il n'y a pas d'autre champ ou méthode de producteur qui renvoie le même type de haricot. Dans le cas contraire, vous devez introduire un qualificatif spécial pour votre champ producteur afin de résoudre l'ambiguïté :

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

avec

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X