@ManagedProperty的CDI替换

Jfl*_*eel 6 java jsf inject 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<CDXmlDescriptor> cdXmlDescriptors;
    @Inject
    private Instance<CDXmlDescriptor> cdXmlDescriptors;
// I also Tried :
//  @Inject
//    private CDParser cdsParser;
//    private List<CDXmlDescriptor> cdXmlDescriptors = cdsParser.getCdsList();

........
Run Code Online (Sandbox Code Playgroud)

然后我添加了(我不确定这是否需要):

@Named
@SessionScoped
public class CDXmlDescriptor implements Serializable { ...
Run Code Online (Sandbox Code Playgroud)

并改变了:

//@ManagedBean(name = "cdsParser")
@Named("CDParser")
//@Named
@SessionScoped
public class CDParser implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 3890828719623315368L;
    @Named
    private List<CDXmlDescriptor> cdsList;
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ndy 5

由于您cdsList不是bean类,因此需要使用producer字段生产者方法来使其可注入.

生产者字段的示例:

import javax.enterprise.inject.Produces;
...
@Named 
@Produces 
private List<CDXmlDescriptor> cdsList;
Run Code Online (Sandbox Code Playgroud)

生产者方法的示例:

import javax.enterprise.inject.Produces;

private List <CDXmlDescriptor> cdsList;
...
@Named("cdsList") 
@Produces 
public List<CDXmlDescriptor> getCdsList {
  return cdsList;
};
Run Code Online (Sandbox Code Playgroud)

如果没有其他生成器字段或生成器方法返回相同的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 {
}
Run Code Online (Sandbox Code Playgroud)

@Named @Produces @CdsList
private List<CDXmlDescriptor> cdsList;
Run Code Online (Sandbox Code Playgroud)