gpt4 book ai didi

jsf - @ManagedProperty 的 CDI 替换

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:18:40 25 4
gpt4 key购买 nike

我正在尝试将 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 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使其可注入(inject)。

生产者字段示例:

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;

关于jsf - @ManagedProperty 的 CDI 替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com