【问题标题】:CDI Replacement for @ManagedProperty@ManagedProperty 的 CDI 替换
【发布时间】:2012-04-13 15:15:44
【问题描述】:

我正在尝试将 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<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}") 的正确方法?

【问题讨论】:

    标签: jsf cdi inject managed-property


    【解决方案1】:

    在 JSF 2.3+ 上,您可以为此使用 javax.faces.annotation.ManagedProperty。它的工作方式与旧的相同,并且由于 JSF 2.3 已弃用 javax.faces.bean.ManagedProperty,您只需向其添加 @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 类型,则此方法有效。否则你需要为你的 producer 字段引入一个特殊的限定符来解决歧义:

    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 这是 Java EE 6,应该在所有兼容的服务器上运行。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多