CDI替代@ManagedProperty的方式

9

我正在尝试将一些 Richfaces 4 演示代码从 JSF 注释转换为使用 CDI。

我知道我可以使用 @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<CDXmlDescriptor> cdXmlDescriptors;
    @Inject
    private Instance<CDXmlDescriptor> cdXmlDescriptors;
// I also Tried :
//  @Inject
//    private CDParser cdsParser;
//    private List<CDXmlDescriptor> 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<CDXmlDescriptor> cdsList;

我无法确定使用CDI替换@ManagedProperty(value = "#{cdsParser.cdsList}")的正确方法。

1个回答

11
在JSF 2.3及以上版本中,您可以使用javax.faces.annotation.ManagedProperty来实现此功能。它与旧的javax.faces.bean.ManagedProperty相同,并且自JSF 2.3以来已被弃用,您只需要添加@Inject即可。
示例:
import javax.faces.annotation.ManagedProperty;
...
@Inject
@ManagedProperty(value = "#{cdsParser.cdsList}")
private List<CDXmlDescriptor> cdXmlDescriptors;

如果您还没有使用JSF 2.3+,那么您需要一个producer fieldproducer method使其可注入。
生产者字段的示例:
import javax.enterprise.inject.Produces;
...
@Named 
@Produces 
private List<CDXmlDescriptor> cdsList;

生产者方法示例:
import javax.enterprise.inject.Produces;

private List <CDXmlDescriptor> cdsList;
...
@Named("cdsList") 
@Produces 
public List<CDXmlDescriptor> 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<CDXmlDescriptor> cdsList;

这似乎假定了使用Jboss而不是Glassfish...? - Thufir
1
@Thufir 这是Java EE 6,应该可以在所有兼容的服务器上运行。 - Matt Handy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接