@ManagedProperty的CDI替换

我对CDI和JSF都很陌生,我正在尝试将Richfaces 4展示的一些代码转换为使用CDI而不是JSF注释。

我知道我可以使用@Named替换@MangedBean和@Inject来替换@ManagedProperty。 但我遇到了一些麻烦。 我正在尝试专门转换Richfaces Tree示例。

我做了以下更改,我知道这是不正确所以请不要使用此:

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

我无法弄清楚使用CDI替换@ManagedProperty(value =“#{cdsParser.cdsList}”)的正确方法?

由于你的cdsList不是bean类,你需要一个producer字段或一个producer方法来使它可注入。

生产者字段的示例:

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

生产者方法的示例:

 import javax.enterprise.inject.Produces; private List  cdsList; ... @Named("cdsList") @Produces public List getCdsList { return cdsList; }; 

如果没有其他生成器字段或生成器方法返回相同的bean类型,则此方法有效。 否则,您需要为生产者字段引入一个特殊限定符来解决歧义:

 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 cdsList;