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