Замена CDI для @ManagedProperty - PullRequest
6 голосов
/ 30 марта 2012

Я очень плохо знаком с CDI и JSF и пытаюсь преобразовать некоторый код из демонстрации Richfaces 4 для использования CDI вместо аннотаций JSF.

Я понимаю, что могу использовать @Named для замены @MangedBean и @Inject для замены @ManagedProperty. Но у меня проблемы. Я пытаюсь преобразовать пример дерева Richfaces.

Я внес следующие изменения и знаю, что это неправильно, поэтому, пожалуйста, не используйте это:

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

Я не могу найти правильный способ замены @ManagedProperty (value = "# {cdsParser.cdsList}") с помощью CDI?

1 Ответ

5 голосов
/ 30 марта 2012

Поскольку ваш cdsList не является классом компонента, вам нужно поле производителя или метод производителя , чтобы сделать его инъекционным.

Пример для поля производителя:

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

Это работает, если нет другого поля производителя или метода производителя, который возвращает тот же тип компонента.В противном случае вам нужно ввести специальный спецификатор для поля вашего производителя, чтобы устранить неоднозначность:

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