Замена CDI для @ManagedProperty
Я очень плохо знаком с 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();
........
Затем я добавил (и я не уверен, что это необходимо):
@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 ответ
Так как ваш 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;